From 046c6202423ff60d14a3f1bbf6ed0ca967d5de6a Mon Sep 17 00:00:00 2001 From: Ali <> Date: Sat, 18 Apr 2020 16:52:12 +0400 Subject: [PATCH 01/12] Fix featured sticker packs UI --- .../Telegram-iOS/en.lproj/Localizable.strings | 2 + .../Sources/PresentationStrings.swift | 3545 +++++++++-------- .../Resources/PresentationStrings.mapping | Bin 149390 -> 149431 bytes .../Sources/ChatMediaInputNode.swift | 8 +- .../Sources/ChatMediaInputTrendingPane.swift | 2 +- .../Sources/FeaturedStickersScreen.swift | 60 +- .../StickerPaneSearchContentNode.swift | 2 +- .../Sources/StickerPaneSearchGlobaltem.swift | 85 +- .../WalletUI/Resources/WalletStrings.mapping | Bin 8422 -> 8422 bytes .../WalletUI/Sources/WalletStrings.swift | 4 +- 10 files changed, 1882 insertions(+), 1826 deletions(-) diff --git a/Telegram/Telegram-iOS/en.lproj/Localizable.strings b/Telegram/Telegram-iOS/en.lproj/Localizable.strings index 7916baaceb..3ff95d7ddb 100644 --- a/Telegram/Telegram-iOS/en.lproj/Localizable.strings +++ b/Telegram/Telegram-iOS/en.lproj/Localizable.strings @@ -5492,3 +5492,5 @@ Any member of this group will be able to see messages in the channel."; "CreatePoll.ExplanationHeader" = "EXPLANATION"; "CreatePoll.Explanation" = "Add a Comment (Optional)"; "CreatePoll.ExplanationInfo" = "Users will see this comment after choosing a wrong answer, good for educational purposes."; + +"FeaturedStickers.OtherSection" = "OTHER"; diff --git a/submodules/TelegramPresentationData/Sources/PresentationStrings.swift b/submodules/TelegramPresentationData/Sources/PresentationStrings.swift index f423e046a9..507d482526 100644 --- a/submodules/TelegramPresentationData/Sources/PresentationStrings.swift +++ b/submodules/TelegramPresentationData/Sources/PresentationStrings.swift @@ -3132,2069 +3132,2065 @@ public final class PresentationStrings: Equatable { public var PeerInfo_AddToContacts: String { return self._s[2738]! } public var Group_OwnershipTransfer_ErrorAdminsTooMuch: String { return self._s[2739]! } public var Passport_Address_TypeRentalAgreement: String { return self._s[2740]! } - public var EditTheme_ShortLink: String { return self._s[2741]! } - public var Theme_Colors_ColorWallpaperWarning: String { return self._s[2742]! } - public var ProxyServer_VoiceOver_Active: String { return self._s[2743]! } - public var ReportPeer_ReasonOther_Placeholder: String { return self._s[2744]! } - public var CheckoutInfo_ErrorPhoneInvalid: String { return self._s[2745]! } - public var Call_Accept: String { return self._s[2747]! } - public var GroupRemoved_RemoveInfo: String { return self._s[2748]! } - public var Month_GenMarch: String { return self._s[2750]! } - public var PhotoEditor_ShadowsTool: String { return self._s[2751]! } - public var LoginPassword_Title: String { return self._s[2752]! } - public var Call_End: String { return self._s[2753]! } - public var Watch_Conversation_GroupInfo: String { return self._s[2754]! } - public var VoiceOver_Chat_Contact: String { return self._s[2755]! } - public var EditTheme_Create_Preview_IncomingText: String { return self._s[2756]! } - public var CallSettings_Always: String { return self._s[2757]! } - public var CallFeedback_Success: String { return self._s[2758]! } - public var TwoStepAuth_SetupHint: String { return self._s[2759]! } + public var FeaturedStickers_OtherSection: String { return self._s[2741]! } + public var EditTheme_ShortLink: String { return self._s[2742]! } + public var Theme_Colors_ColorWallpaperWarning: String { return self._s[2743]! } + public var ProxyServer_VoiceOver_Active: String { return self._s[2744]! } + public var ReportPeer_ReasonOther_Placeholder: String { return self._s[2745]! } + public var CheckoutInfo_ErrorPhoneInvalid: String { return self._s[2746]! } + public var Call_Accept: String { return self._s[2748]! } + public var GroupRemoved_RemoveInfo: String { return self._s[2749]! } + public var Month_GenMarch: String { return self._s[2751]! } + public var PhotoEditor_ShadowsTool: String { return self._s[2752]! } + public var LoginPassword_Title: String { return self._s[2753]! } + public var Call_End: String { return self._s[2754]! } + public var Watch_Conversation_GroupInfo: String { return self._s[2755]! } + public var VoiceOver_Chat_Contact: String { return self._s[2756]! } + public var EditTheme_Create_Preview_IncomingText: String { return self._s[2757]! } + public var CallSettings_Always: String { return self._s[2758]! } + public var CallFeedback_Success: String { return self._s[2759]! } + public var TwoStepAuth_SetupHint: String { return self._s[2760]! } public func AddContact_ContactWillBeSharedAfterMutual(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2760]!, self._r[2760]!, [_1]) + return formatWithArgumentRanges(self._s[2761]!, self._r[2761]!, [_1]) } - public var ConversationProfile_UsersTooMuchError: String { return self._s[2761]! } - public var PeerInfo_ButtonAddMember: String { return self._s[2762]! } - public var Login_PhoneTitle: String { return self._s[2763]! } - public var Passport_FieldPhoneHelp: String { return self._s[2764]! } - public var Weekday_ShortSunday: String { return self._s[2765]! } - public var Passport_InfoFAQ_URL: String { return self._s[2766]! } - public var ContactInfo_Job: String { return self._s[2768]! } - public var UserInfo_InviteBotToGroup: String { return self._s[2769]! } - public var Appearance_ThemeCarouselNightBlue: String { return self._s[2770]! } - public var CreatePoll_QuizTip: String { return self._s[2771]! } - public var TwoFactorSetup_Email_Text: String { return self._s[2772]! } - public var TwoStepAuth_PasswordRemovePassportConfirmation: String { return self._s[2773]! } - public var Invite_ChannelsTooMuch: String { return self._s[2774]! } - public var Wallet_Send_ConfirmationConfirm: String { return self._s[2775]! } - public var Wallet_TransactionInfo_OtherFeeInfo: String { return self._s[2776]! } - public var SettingsSearch_Synonyms_Notifications_InAppNotificationsPreview: String { return self._s[2777]! } - public var Wallet_Receive_AmountText: String { return self._s[2778]! } - public var Passport_DeletePersonalDetailsConfirmation: String { return self._s[2779]! } - public var CallFeedback_ReasonNoise: String { return self._s[2780]! } - public var Appearance_AppIconDefault: String { return self._s[2782]! } - public var Passport_Identity_AddInternalPassport: String { return self._s[2783]! } - public var MediaPicker_AddCaption: String { return self._s[2784]! } - public var CallSettings_TabIconDescription: String { return self._s[2785]! } + public var ConversationProfile_UsersTooMuchError: String { return self._s[2762]! } + public var PeerInfo_ButtonAddMember: String { return self._s[2763]! } + public var Login_PhoneTitle: String { return self._s[2764]! } + public var Passport_FieldPhoneHelp: String { return self._s[2765]! } + public var Weekday_ShortSunday: String { return self._s[2766]! } + public var Passport_InfoFAQ_URL: String { return self._s[2767]! } + public var ContactInfo_Job: String { return self._s[2769]! } + public var UserInfo_InviteBotToGroup: String { return self._s[2770]! } + public var Appearance_ThemeCarouselNightBlue: String { return self._s[2771]! } + public var CreatePoll_QuizTip: String { return self._s[2772]! } + public var TwoFactorSetup_Email_Text: String { return self._s[2773]! } + public var TwoStepAuth_PasswordRemovePassportConfirmation: String { return self._s[2774]! } + public var Invite_ChannelsTooMuch: String { return self._s[2775]! } + public var Wallet_Send_ConfirmationConfirm: String { return self._s[2776]! } + public var Wallet_TransactionInfo_OtherFeeInfo: String { return self._s[2777]! } + public var SettingsSearch_Synonyms_Notifications_InAppNotificationsPreview: String { return self._s[2778]! } + public var Wallet_Receive_AmountText: String { return self._s[2779]! } + public var Passport_DeletePersonalDetailsConfirmation: String { return self._s[2780]! } + public var CallFeedback_ReasonNoise: String { return self._s[2781]! } + public var Appearance_AppIconDefault: String { return self._s[2783]! } + public var Passport_Identity_AddInternalPassport: String { return self._s[2784]! } + public var MediaPicker_AddCaption: String { return self._s[2785]! } + public var CallSettings_TabIconDescription: String { return self._s[2786]! } public func VoiceOver_Chat_Caption(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2786]!, self._r[2786]!, [_0]) + return formatWithArgumentRanges(self._s[2787]!, self._r[2787]!, [_0]) } - public var IntentsSettings_SuggestedChatsGroups: String { return self._s[2787]! } + public var IntentsSettings_SuggestedChatsGroups: String { return self._s[2788]! } public func Map_SearchNoResultsDescription(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2788]!, self._r[2788]!, [_0]) + return formatWithArgumentRanges(self._s[2789]!, self._r[2789]!, [_0]) } - public var CreatePoll_ExplanationHeader: String { return self._s[2790]! } - public var ChatList_UndoArchiveHiddenTitle: String { return self._s[2791]! } - public var Privacy_GroupsAndChannels_AlwaysAllow: String { return self._s[2792]! } - public var Passport_Identity_TypePersonalDetails: String { return self._s[2793]! } - public var DialogList_SearchSectionRecent: String { return self._s[2794]! } - public var PrivacyPolicy_DeclineMessage: String { return self._s[2795]! } - public var CreatePoll_Anonymous: String { return self._s[2796]! } - public var LogoutOptions_ClearCacheText: String { return self._s[2799]! } - public var LastSeen_WithinAWeek: String { return self._s[2800]! } - public var ChannelMembers_GroupAdminsTitle: String { return self._s[2801]! } - public var Conversation_CloudStorage_ChatStatus: String { return self._s[2803]! } - public var VoiceOver_Media_PlaybackRateNormal: String { return self._s[2804]! } + public var CreatePoll_ExplanationHeader: String { return self._s[2791]! } + public var ChatList_UndoArchiveHiddenTitle: String { return self._s[2792]! } + public var Privacy_GroupsAndChannels_AlwaysAllow: String { return self._s[2793]! } + public var Passport_Identity_TypePersonalDetails: String { return self._s[2794]! } + public var DialogList_SearchSectionRecent: String { return self._s[2795]! } + public var PrivacyPolicy_DeclineMessage: String { return self._s[2796]! } + public var CreatePoll_Anonymous: String { return self._s[2797]! } + public var LogoutOptions_ClearCacheText: String { return self._s[2800]! } + public var LastSeen_WithinAWeek: String { return self._s[2801]! } + public var ChannelMembers_GroupAdminsTitle: String { return self._s[2802]! } + public var Conversation_CloudStorage_ChatStatus: String { return self._s[2804]! } + public var VoiceOver_Media_PlaybackRateNormal: String { return self._s[2805]! } public func AddContact_SharedContactExceptionInfo(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2805]!, self._r[2805]!, [_0]) + return formatWithArgumentRanges(self._s[2806]!, self._r[2806]!, [_0]) } - public var Passport_Address_TypeResidentialAddress: String { return self._s[2806]! } - public var Conversation_StatusLeftGroup: String { return self._s[2807]! } - public var SocksProxySetup_ProxyDetailsTitle: String { return self._s[2808]! } - public var SettingsSearch_Synonyms_Calls_Title: String { return self._s[2810]! } - public var GroupPermission_AddSuccess: String { return self._s[2811]! } - public var PhotoEditor_BlurToolRadial: String { return self._s[2813]! } - public var Conversation_ContextMenuCopy: String { return self._s[2814]! } - public var AccessDenied_CallMicrophone: String { return self._s[2815]! } + public var Passport_Address_TypeResidentialAddress: String { return self._s[2807]! } + public var Conversation_StatusLeftGroup: String { return self._s[2808]! } + public var SocksProxySetup_ProxyDetailsTitle: String { return self._s[2809]! } + public var SettingsSearch_Synonyms_Calls_Title: String { return self._s[2811]! } + public var GroupPermission_AddSuccess: String { return self._s[2812]! } + public var PhotoEditor_BlurToolRadial: String { return self._s[2814]! } + public var Conversation_ContextMenuCopy: String { return self._s[2815]! } + public var AccessDenied_CallMicrophone: String { return self._s[2816]! } public func Time_PreciseDate_m2(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2816]!, self._r[2816]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[2817]!, self._r[2817]!, [_1, _2, _3]) } - public var Login_InvalidFirstNameError: String { return self._s[2817]! } - public var Notifications_Badge_CountUnreadMessages_InfoOn: String { return self._s[2818]! } - public var Checkout_PaymentMethod_New: String { return self._s[2819]! } - public var ShareMenu_CopyShareLinkGame: String { return self._s[2820]! } - public var PhotoEditor_QualityTool: String { return self._s[2821]! } - public var Login_SendCodeViaSms: String { return self._s[2822]! } - public var SettingsSearch_Synonyms_Privacy_DeleteAccountIfAwayFor: String { return self._s[2823]! } - public var Chat_SlowmodeAttachmentLimitReached: String { return self._s[2824]! } - public var Wallet_Receive_CopyAddress: String { return self._s[2825]! } - public var Login_EmailNotConfiguredError: String { return self._s[2826]! } - public var SocksProxySetup_Status: String { return self._s[2827]! } - public var Conversation_ScheduleMessage_SendWhenOnline: String { return self._s[2828]! } - public var PrivacyPolicy_Accept: String { return self._s[2829]! } - public var Notifications_ExceptionsMessagePlaceholder: String { return self._s[2830]! } - public var Appearance_AppIconClassicX: String { return self._s[2831]! } + public var Login_InvalidFirstNameError: String { return self._s[2818]! } + public var Notifications_Badge_CountUnreadMessages_InfoOn: String { return self._s[2819]! } + public var Checkout_PaymentMethod_New: String { return self._s[2820]! } + public var ShareMenu_CopyShareLinkGame: String { return self._s[2821]! } + public var PhotoEditor_QualityTool: String { return self._s[2822]! } + public var Login_SendCodeViaSms: String { return self._s[2823]! } + public var SettingsSearch_Synonyms_Privacy_DeleteAccountIfAwayFor: String { return self._s[2824]! } + public var Chat_SlowmodeAttachmentLimitReached: String { return self._s[2825]! } + public var Wallet_Receive_CopyAddress: String { return self._s[2826]! } + public var Login_EmailNotConfiguredError: String { return self._s[2827]! } + public var SocksProxySetup_Status: String { return self._s[2828]! } + public var Conversation_ScheduleMessage_SendWhenOnline: String { return self._s[2829]! } + public var PrivacyPolicy_Accept: String { return self._s[2830]! } + public var Notifications_ExceptionsMessagePlaceholder: String { return self._s[2831]! } + public var Appearance_AppIconClassicX: String { return self._s[2832]! } public func PUSH_CHAT_MESSAGE_TEXT(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2832]!, self._r[2832]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[2833]!, self._r[2833]!, [_1, _2, _3]) } - public var OwnershipTransfer_SecurityRequirements: String { return self._s[2833]! } - public var InfoPlist_NSLocationAlwaysUsageDescription: String { return self._s[2835]! } - public var AutoNightTheme_Automatic: String { return self._s[2836]! } - public var Channel_Username_InvalidStartsWithNumber: String { return self._s[2837]! } - public var Privacy_ContactsSyncHelp: String { return self._s[2838]! } - public var Cache_Help: String { return self._s[2839]! } - public var Group_ErrorAccessDenied: String { return self._s[2840]! } - public var Passport_Language_fa: String { return self._s[2841]! } - public var Wallet_Intro_Text: String { return self._s[2842]! } - public var Login_ResetAccountProtected_TimerTitle: String { return self._s[2843]! } - public var VoiceOver_Chat_YourVideoMessage: String { return self._s[2844]! } - public var PrivacySettings_LastSeen: String { return self._s[2845]! } + public var OwnershipTransfer_SecurityRequirements: String { return self._s[2834]! } + public var InfoPlist_NSLocationAlwaysUsageDescription: String { return self._s[2836]! } + public var AutoNightTheme_Automatic: String { return self._s[2837]! } + public var Channel_Username_InvalidStartsWithNumber: String { return self._s[2838]! } + public var Privacy_ContactsSyncHelp: String { return self._s[2839]! } + public var Cache_Help: String { return self._s[2840]! } + public var Group_ErrorAccessDenied: String { return self._s[2841]! } + public var Passport_Language_fa: String { return self._s[2842]! } + public var Wallet_Intro_Text: String { return self._s[2843]! } + public var Login_ResetAccountProtected_TimerTitle: String { return self._s[2844]! } + public var VoiceOver_Chat_YourVideoMessage: String { return self._s[2845]! } + public var PrivacySettings_LastSeen: String { return self._s[2846]! } public func DialogList_MultipleTyping(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2846]!, self._r[2846]!, [_0, _1]) + return formatWithArgumentRanges(self._s[2847]!, self._r[2847]!, [_0, _1]) } - public var Wallet_Configuration_Apply: String { return self._s[2850]! } - public var Preview_SaveGif: String { return self._s[2851]! } - public var SettingsSearch_Synonyms_Privacy_TwoStepAuth: String { return self._s[2852]! } - public var Profile_About: String { return self._s[2853]! } - public var Channel_About_Placeholder: String { return self._s[2854]! } - public var Login_InfoTitle: String { return self._s[2855]! } + public var Wallet_Configuration_Apply: String { return self._s[2851]! } + public var Preview_SaveGif: String { return self._s[2852]! } + public var SettingsSearch_Synonyms_Privacy_TwoStepAuth: String { return self._s[2853]! } + public var Profile_About: String { return self._s[2854]! } + public var Channel_About_Placeholder: String { return self._s[2855]! } + public var Login_InfoTitle: String { return self._s[2856]! } public func TwoStepAuth_SetupPendingEmail(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2856]!, self._r[2856]!, [_0]) + return formatWithArgumentRanges(self._s[2857]!, self._r[2857]!, [_0]) } - public var EditTheme_Expand_Preview_IncomingReplyText: String { return self._s[2857]! } - public var Watch_Suggestion_CantTalk: String { return self._s[2859]! } - public var ContactInfo_Title: String { return self._s[2860]! } - public var Media_ShareThisVideo: String { return self._s[2861]! } - public var Weekday_ShortFriday: String { return self._s[2862]! } - public var AccessDenied_Contacts: String { return self._s[2864]! } - public var Notification_CallIncomingShort: String { return self._s[2865]! } - public var Group_Setup_TypePublic: String { return self._s[2866]! } - public var Notifications_MessageNotificationsExceptions: String { return self._s[2867]! } - public var Notifications_Badge_IncludeChannels: String { return self._s[2868]! } - public var Notifications_MessageNotificationsPreview: String { return self._s[2871]! } - public var ConversationProfile_ErrorCreatingConversation: String { return self._s[2872]! } - public var Group_ErrorAddTooMuchBots: String { return self._s[2873]! } - public var Privacy_GroupsAndChannels_CustomShareHelp: String { return self._s[2874]! } - public var Permissions_CellularDataAllowInSettings_v0: String { return self._s[2875]! } + public var EditTheme_Expand_Preview_IncomingReplyText: String { return self._s[2858]! } + public var Watch_Suggestion_CantTalk: String { return self._s[2860]! } + public var ContactInfo_Title: String { return self._s[2861]! } + public var Media_ShareThisVideo: String { return self._s[2862]! } + public var Weekday_ShortFriday: String { return self._s[2863]! } + public var AccessDenied_Contacts: String { return self._s[2865]! } + public var Notification_CallIncomingShort: String { return self._s[2866]! } + public var Group_Setup_TypePublic: String { return self._s[2867]! } + public var Notifications_MessageNotificationsExceptions: String { return self._s[2868]! } + public var Notifications_Badge_IncludeChannels: String { return self._s[2869]! } + public var Notifications_MessageNotificationsPreview: String { return self._s[2872]! } + public var ConversationProfile_ErrorCreatingConversation: String { return self._s[2873]! } + public var Group_ErrorAddTooMuchBots: String { return self._s[2874]! } + public var Privacy_GroupsAndChannels_CustomShareHelp: String { return self._s[2875]! } + public var Permissions_CellularDataAllowInSettings_v0: String { return self._s[2876]! } public func Wallet_SecureStorageChanged_BiometryText(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2876]!, self._r[2876]!, [_0]) + return formatWithArgumentRanges(self._s[2877]!, self._r[2877]!, [_0]) } - public var DialogList_Typing: String { return self._s[2877]! } - public var CallFeedback_IncludeLogs: String { return self._s[2879]! } - public var Checkout_Phone: String { return self._s[2881]! } - public var Login_InfoFirstNamePlaceholder: String { return self._s[2884]! } - public var Privacy_Calls_Integration: String { return self._s[2885]! } - public var Notifications_PermissionsAllow: String { return self._s[2886]! } - public var TwoStepAuth_AddHintDescription: String { return self._s[2892]! } - public var Settings_ChatSettings: String { return self._s[2893]! } - public var Conversation_SendingOptionsTooltip: String { return self._s[2894]! } + public var DialogList_Typing: String { return self._s[2878]! } + public var CallFeedback_IncludeLogs: String { return self._s[2880]! } + public var Checkout_Phone: String { return self._s[2882]! } + public var Login_InfoFirstNamePlaceholder: String { return self._s[2885]! } + public var Privacy_Calls_Integration: String { return self._s[2886]! } + public var Notifications_PermissionsAllow: String { return self._s[2887]! } + public var TwoStepAuth_AddHintDescription: String { return self._s[2893]! } + public var Settings_ChatSettings: String { return self._s[2894]! } + public var Conversation_SendingOptionsTooltip: String { return self._s[2895]! } public func UserInfo_StartSecretChatConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2896]!, self._r[2896]!, [_0]) + return formatWithArgumentRanges(self._s[2897]!, self._r[2897]!, [_0]) } public func Channel_AdminLog_MessageInvitedNameUsername(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2897]!, self._r[2897]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2898]!, self._r[2898]!, [_1, _2]) } - public var GroupRemoved_DeleteUser: String { return self._s[2899]! } + public var GroupRemoved_DeleteUser: String { return self._s[2900]! } public func Channel_AdminLog_PollStopped(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2900]!, self._r[2900]!, [_0]) + return formatWithArgumentRanges(self._s[2901]!, self._r[2901]!, [_0]) } - public var ChatListFolder_CategoryMuted: String { return self._s[2901]! } + public var ChatListFolder_CategoryMuted: String { return self._s[2902]! } public func PUSH_MESSAGE_PHOTO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2902]!, self._r[2902]!, [_1]) + return formatWithArgumentRanges(self._s[2903]!, self._r[2903]!, [_1]) } - public var Login_ContinueWithLocalization: String { return self._s[2903]! } - public var Watch_Message_ForwardedFrom: String { return self._s[2904]! } - public var TwoStepAuth_EnterEmailCode: String { return self._s[2906]! } - public var Conversation_Unblock: String { return self._s[2907]! } - public var PrivacySettings_DataSettings: String { return self._s[2908]! } - public var WallpaperPreview_PatternPaternApply: String { return self._s[2909]! } - public var Group_PublicLink_Info: String { return self._s[2910]! } + public var Login_ContinueWithLocalization: String { return self._s[2904]! } + public var Watch_Message_ForwardedFrom: String { return self._s[2905]! } + public var TwoStepAuth_EnterEmailCode: String { return self._s[2907]! } + public var Conversation_Unblock: String { return self._s[2908]! } + public var PrivacySettings_DataSettings: String { return self._s[2909]! } + public var WallpaperPreview_PatternPaternApply: String { return self._s[2910]! } + public var Group_PublicLink_Info: String { return self._s[2911]! } public func Wallet_Time_PreciseDate_m1(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2911]!, self._r[2911]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[2912]!, self._r[2912]!, [_1, _2, _3]) } - public var Notifications_InAppNotificationsVibrate: String { return self._s[2912]! } + public var Notifications_InAppNotificationsVibrate: String { return self._s[2913]! } public func Privacy_GroupsAndChannels_InviteToChannelError(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2913]!, self._r[2913]!, [_0, _1]) + return formatWithArgumentRanges(self._s[2914]!, self._r[2914]!, [_0, _1]) } - public var ChatList_FolderAllChats: String { return self._s[2914]! } - public var OldChannels_ChannelsHeader: String { return self._s[2916]! } - public var Wallet_RestoreFailed_CreateWallet: String { return self._s[2917]! } - public var PrivacySettings_Passcode: String { return self._s[2919]! } - public var Call_Mute: String { return self._s[2920]! } - public var Wallet_Weekday_Yesterday: String { return self._s[2921]! } - public var Passport_Language_dz: String { return self._s[2922]! } - public var Wallet_Receive_AmountHeader: String { return self._s[2923]! } - public var Wallet_TransactionInfo_OtherFeeInfoUrl: String { return self._s[2924]! } - public var Passport_Language_tk: String { return self._s[2925]! } + public var ChatList_FolderAllChats: String { return self._s[2915]! } + public var OldChannels_ChannelsHeader: String { return self._s[2917]! } + public var Wallet_RestoreFailed_CreateWallet: String { return self._s[2918]! } + public var PrivacySettings_Passcode: String { return self._s[2920]! } + public var Call_Mute: String { return self._s[2921]! } + public var Wallet_Weekday_Yesterday: String { return self._s[2922]! } + public var Passport_Language_dz: String { return self._s[2923]! } + public var Wallet_Receive_AmountHeader: String { return self._s[2924]! } + public var Wallet_TransactionInfo_OtherFeeInfoUrl: String { return self._s[2925]! } + public var Passport_Language_tk: String { return self._s[2926]! } public func Login_EmailCodeSubject(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2926]!, self._r[2926]!, [_0]) + return formatWithArgumentRanges(self._s[2927]!, self._r[2927]!, [_0]) } - public var Settings_Search: String { return self._s[2927]! } - public var Wallet_Month_ShortFebruary: String { return self._s[2928]! } - public var InfoPlist_NSPhotoLibraryUsageDescription: String { return self._s[2929]! } - public var Wallet_Configuration_SourceJSON: String { return self._s[2930]! } - public var Conversation_ContextMenuReply: String { return self._s[2931]! } - public var WallpaperSearch_ColorBrown: String { return self._s[2932]! } - public var Chat_AttachmentMultipleForwardDisabled: String { return self._s[2933]! } - public var Tour_Title1: String { return self._s[2934]! } - public var Wallet_Alert_Cancel: String { return self._s[2935]! } - public var Stats_Total: String { return self._s[2938]! } - public var Conversation_ClearGroupHistory: String { return self._s[2939]! } - public var Wallet_TransactionInfo_RecipientHeader: String { return self._s[2940]! } - public var WallpaperPreview_Motion: String { return self._s[2941]! } + public var Settings_Search: String { return self._s[2928]! } + public var Wallet_Month_ShortFebruary: String { return self._s[2929]! } + public var InfoPlist_NSPhotoLibraryUsageDescription: String { return self._s[2930]! } + public var Wallet_Configuration_SourceJSON: String { return self._s[2931]! } + public var Conversation_ContextMenuReply: String { return self._s[2932]! } + public var WallpaperSearch_ColorBrown: String { return self._s[2933]! } + public var Chat_AttachmentMultipleForwardDisabled: String { return self._s[2934]! } + public var Tour_Title1: String { return self._s[2935]! } + public var Wallet_Alert_Cancel: String { return self._s[2936]! } + public var Stats_Total: String { return self._s[2939]! } + public var Conversation_ClearGroupHistory: String { return self._s[2940]! } + public var Wallet_TransactionInfo_RecipientHeader: String { return self._s[2941]! } + public var WallpaperPreview_Motion: String { return self._s[2942]! } public func Checkout_PasswordEntry_Text(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2942]!, self._r[2942]!, [_0]) + return formatWithArgumentRanges(self._s[2943]!, self._r[2943]!, [_0]) } - public var Wallet_Configuration_ApplyErrorTextJSONInvalidData: String { return self._s[2943]! } - public var Call_RateCall: String { return self._s[2944]! } - public var Channel_AdminLog_BanSendStickersAndGifs: String { return self._s[2945]! } - public var Passport_PasswordCompleteSetup: String { return self._s[2946]! } - public var Conversation_InputTextSilentBroadcastPlaceholder: String { return self._s[2948]! } - public var UserInfo_LastNamePlaceholder: String { return self._s[2950]! } + public var Wallet_Configuration_ApplyErrorTextJSONInvalidData: String { return self._s[2944]! } + public var Call_RateCall: String { return self._s[2945]! } + public var Channel_AdminLog_BanSendStickersAndGifs: String { return self._s[2946]! } + public var Passport_PasswordCompleteSetup: String { return self._s[2947]! } + public var Conversation_InputTextSilentBroadcastPlaceholder: String { return self._s[2949]! } + public var UserInfo_LastNamePlaceholder: String { return self._s[2951]! } public func Login_WillCallYou(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2952]!, self._r[2952]!, [_0]) + return formatWithArgumentRanges(self._s[2953]!, self._r[2953]!, [_0]) } - public var Compose_Create: String { return self._s[2953]! } - public var Contacts_InviteToTelegram: String { return self._s[2954]! } - public var GroupInfo_Notifications: String { return self._s[2955]! } - public var ChatList_DeleteSavedMessagesConfirmationAction: String { return self._s[2957]! } - public var Message_PinnedLiveLocationMessage: String { return self._s[2958]! } - public var Month_GenApril: String { return self._s[2959]! } - public var Appearance_AutoNightTheme: String { return self._s[2960]! } - public var ChatSettings_AutomaticAudioDownload: String { return self._s[2962]! } - public var Login_CodeSentSms: String { return self._s[2964]! } + public var Compose_Create: String { return self._s[2954]! } + public var Contacts_InviteToTelegram: String { return self._s[2955]! } + public var GroupInfo_Notifications: String { return self._s[2956]! } + public var ChatList_DeleteSavedMessagesConfirmationAction: String { return self._s[2958]! } + public var Message_PinnedLiveLocationMessage: String { return self._s[2959]! } + public var Month_GenApril: String { return self._s[2960]! } + public var Appearance_AutoNightTheme: String { return self._s[2961]! } + public var ChatSettings_AutomaticAudioDownload: String { return self._s[2963]! } + public var Login_CodeSentSms: String { return self._s[2965]! } public func UserInfo_UnblockConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2965]!, self._r[2965]!, [_0]) + return formatWithArgumentRanges(self._s[2966]!, self._r[2966]!, [_0]) } - public var EmptyGroupInfo_Line3: String { return self._s[2966]! } - public var LogoutOptions_ContactSupportText: String { return self._s[2967]! } - public var Passport_Language_hr: String { return self._s[2968]! } - public var Common_ActionNotAllowedError: String { return self._s[2969]! } + public var EmptyGroupInfo_Line3: String { return self._s[2967]! } + public var LogoutOptions_ContactSupportText: String { return self._s[2968]! } + public var Passport_Language_hr: String { return self._s[2969]! } + public var Common_ActionNotAllowedError: String { return self._s[2970]! } public func Channel_AdminLog_MessageRestrictedNewSetting(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2970]!, self._r[2970]!, [_0]) + return formatWithArgumentRanges(self._s[2971]!, self._r[2971]!, [_0]) } - public var GroupInfo_InviteLink_CopyLink: String { return self._s[2971]! } - public var Wallet_Info_TransactionFrom: String { return self._s[2972]! } - public var Wallet_Send_ErrorDecryptionFailed: String { return self._s[2973]! } - public var Conversation_InputTextBroadcastPlaceholder: String { return self._s[2974]! } - public var Privacy_SecretChatsTitle: String { return self._s[2975]! } - public var Notification_SecretChatMessageScreenshotSelf: String { return self._s[2977]! } - public var GroupInfo_AddUserLeftError: String { return self._s[2978]! } - public var AutoDownloadSettings_TypePrivateChats: String { return self._s[2979]! } - public var ChatListFolder_NameSectionHeader: String { return self._s[2980]! } - public var LogoutOptions_ContactSupportTitle: String { return self._s[2981]! } - public var Appearance_ThemePreview_Chat_7_Text: String { return self._s[2982]! } - public var Channel_AddBotErrorHaveRights: String { return self._s[2983]! } - public var Preview_DeleteGif: String { return self._s[2984]! } - public var GroupInfo_Permissions_Exceptions: String { return self._s[2985]! } - public var Group_ErrorNotMutualContact: String { return self._s[2986]! } - public var Notification_MessageLifetime5s: String { return self._s[2987]! } - public var Wallet_Send_OwnAddressAlertText: String { return self._s[2988]! } - public var OldChannels_ChannelFormat: String { return self._s[2989]! } + public var GroupInfo_InviteLink_CopyLink: String { return self._s[2972]! } + public var Wallet_Info_TransactionFrom: String { return self._s[2973]! } + public var Wallet_Send_ErrorDecryptionFailed: String { return self._s[2974]! } + public var Conversation_InputTextBroadcastPlaceholder: String { return self._s[2975]! } + public var Privacy_SecretChatsTitle: String { return self._s[2976]! } + public var Notification_SecretChatMessageScreenshotSelf: String { return self._s[2978]! } + public var GroupInfo_AddUserLeftError: String { return self._s[2979]! } + public var AutoDownloadSettings_TypePrivateChats: String { return self._s[2980]! } + public var ChatListFolder_NameSectionHeader: String { return self._s[2981]! } + public var LogoutOptions_ContactSupportTitle: String { return self._s[2982]! } + public var Appearance_ThemePreview_Chat_7_Text: String { return self._s[2983]! } + public var Channel_AddBotErrorHaveRights: String { return self._s[2984]! } + public var Preview_DeleteGif: String { return self._s[2985]! } + public var GroupInfo_Permissions_Exceptions: String { return self._s[2986]! } + public var Group_ErrorNotMutualContact: String { return self._s[2987]! } + public var Notification_MessageLifetime5s: String { return self._s[2988]! } + public var Wallet_Send_OwnAddressAlertText: String { return self._s[2989]! } + public var OldChannels_ChannelFormat: String { return self._s[2990]! } public func Watch_LastSeen_AtDate(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2990]!, self._r[2990]!, [_0]) + return formatWithArgumentRanges(self._s[2991]!, self._r[2991]!, [_0]) } - public var VoiceOver_Chat_Video: String { return self._s[2991]! } - public var Channel_OwnershipTransfer_ErrorPublicChannelsTooMuch: String { return self._s[2993]! } - public var ReportSpam_DeleteThisChat: String { return self._s[2994]! } - public var Passport_Address_AddBankStatement: String { return self._s[2995]! } - public var Notification_CallIncoming: String { return self._s[2996]! } - public var Wallet_Words_NotDoneTitle: String { return self._s[2997]! } - public var Compose_NewGroupTitle: String { return self._s[2998]! } - public var TwoStepAuth_RecoveryCodeHelp: String { return self._s[3000]! } - public var Passport_Address_Postcode: String { return self._s[3002]! } + public var VoiceOver_Chat_Video: String { return self._s[2992]! } + public var Channel_OwnershipTransfer_ErrorPublicChannelsTooMuch: String { return self._s[2994]! } + public var ReportSpam_DeleteThisChat: String { return self._s[2995]! } + public var Passport_Address_AddBankStatement: String { return self._s[2996]! } + public var Notification_CallIncoming: String { return self._s[2997]! } + public var Wallet_Words_NotDoneTitle: String { return self._s[2998]! } + public var Compose_NewGroupTitle: String { return self._s[2999]! } + public var TwoStepAuth_RecoveryCodeHelp: String { return self._s[3001]! } + public var Passport_Address_Postcode: String { return self._s[3003]! } public func LastSeen_YesterdayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3003]!, self._r[3003]!, [_0]) + return formatWithArgumentRanges(self._s[3004]!, self._r[3004]!, [_0]) } - public var Checkout_NewCard_SaveInfoHelp: String { return self._s[3004]! } - public var Wallet_Month_ShortOctober: String { return self._s[3005]! } - public var VoiceOver_Chat_YourMusic: String { return self._s[3006]! } - public var WallpaperColors_Title: String { return self._s[3007]! } - public var SocksProxySetup_ShareQRCodeInfo: String { return self._s[3008]! } - public var VoiceOver_MessageContextForward: String { return self._s[3009]! } - public var GroupPermission_Duration: String { return self._s[3010]! } + public var Checkout_NewCard_SaveInfoHelp: String { return self._s[3005]! } + public var Wallet_Month_ShortOctober: String { return self._s[3006]! } + public var VoiceOver_Chat_YourMusic: String { return self._s[3007]! } + public var WallpaperColors_Title: String { return self._s[3008]! } + public var SocksProxySetup_ShareQRCodeInfo: String { return self._s[3009]! } + public var VoiceOver_MessageContextForward: String { return self._s[3010]! } + public var GroupPermission_Duration: String { return self._s[3011]! } public func Cache_Clear(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3011]!, self._r[3011]!, [_0]) + return formatWithArgumentRanges(self._s[3012]!, self._r[3012]!, [_0]) } - public var Bot_GroupStatusDoesNotReadHistory: String { return self._s[3012]! } - public var Username_Placeholder: String { return self._s[3013]! } - public var CallFeedback_WhatWentWrong: String { return self._s[3014]! } - public var Passport_FieldAddressUploadHelp: String { return self._s[3015]! } - public var Permissions_NotificationsAllowInSettings_v0: String { return self._s[3016]! } + public var Bot_GroupStatusDoesNotReadHistory: String { return self._s[3013]! } + public var Username_Placeholder: String { return self._s[3014]! } + public var CallFeedback_WhatWentWrong: String { return self._s[3015]! } + public var Passport_FieldAddressUploadHelp: String { return self._s[3016]! } + public var Permissions_NotificationsAllowInSettings_v0: String { return self._s[3017]! } public func Channel_AdminLog_MessageChangedUnlinkedChannel(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3018]!, self._r[3018]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3019]!, self._r[3019]!, [_1, _2]) } - public var Passport_PasswordDescription: String { return self._s[3019]! } - public var Channel_MessagePhotoUpdated: String { return self._s[3020]! } - public var MediaPicker_TapToUngroupDescription: String { return self._s[3021]! } - public var SettingsSearch_Synonyms_Notifications_BadgeCountUnreadMessages: String { return self._s[3022]! } - public var AttachmentMenu_PhotoOrVideo: String { return self._s[3023]! } - public var Conversation_ContextMenuMore: String { return self._s[3024]! } - public var Privacy_PaymentsClearInfo: String { return self._s[3025]! } - public var CallSettings_TabIcon: String { return self._s[3026]! } - public var KeyCommand_Find: String { return self._s[3027]! } - public var ClearCache_FreeSpaceDescription: String { return self._s[3028]! } - public var Appearance_ThemePreview_ChatList_7_Text: String { return self._s[3029]! } - public var EditTheme_Edit_Preview_IncomingText: String { return self._s[3030]! } - public var Message_PinnedGame: String { return self._s[3031]! } - public var VoiceOver_Chat_ForwardedFromYou: String { return self._s[3032]! } - public var Notifications_Badge_CountUnreadMessages_InfoOff: String { return self._s[3034]! } - public var Login_CallRequestState2: String { return self._s[3036]! } - public var CheckoutInfo_ReceiverInfoNamePlaceholder: String { return self._s[3038]! } + public var Passport_PasswordDescription: String { return self._s[3020]! } + public var Channel_MessagePhotoUpdated: String { return self._s[3021]! } + public var MediaPicker_TapToUngroupDescription: String { return self._s[3022]! } + public var SettingsSearch_Synonyms_Notifications_BadgeCountUnreadMessages: String { return self._s[3023]! } + public var AttachmentMenu_PhotoOrVideo: String { return self._s[3024]! } + public var Conversation_ContextMenuMore: String { return self._s[3025]! } + public var Privacy_PaymentsClearInfo: String { return self._s[3026]! } + public var CallSettings_TabIcon: String { return self._s[3027]! } + public var KeyCommand_Find: String { return self._s[3028]! } + public var ClearCache_FreeSpaceDescription: String { return self._s[3029]! } + public var Appearance_ThemePreview_ChatList_7_Text: String { return self._s[3030]! } + public var EditTheme_Edit_Preview_IncomingText: String { return self._s[3031]! } + public var Message_PinnedGame: String { return self._s[3032]! } + public var VoiceOver_Chat_ForwardedFromYou: String { return self._s[3033]! } + public var Notifications_Badge_CountUnreadMessages_InfoOff: String { return self._s[3035]! } + public var Login_CallRequestState2: String { return self._s[3037]! } + public var CheckoutInfo_ReceiverInfoNamePlaceholder: String { return self._s[3039]! } public func VoiceOver_Chat_PhotoFrom(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3039]!, self._r[3039]!, [_0]) + return formatWithArgumentRanges(self._s[3040]!, self._r[3040]!, [_0]) } public func Checkout_PayPrice(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3041]!, self._r[3041]!, [_0]) + return formatWithArgumentRanges(self._s[3042]!, self._r[3042]!, [_0]) } - public var AuthSessions_AddDevice: String { return self._s[3042]! } - public var WallpaperPreview_Blurred: String { return self._s[3043]! } - public var Conversation_InstantPagePreview: String { return self._s[3044]! } - public var PeerInfo_ButtonUnmute: String { return self._s[3045]! } + public var AuthSessions_AddDevice: String { return self._s[3043]! } + public var WallpaperPreview_Blurred: String { return self._s[3044]! } + public var Conversation_InstantPagePreview: String { return self._s[3045]! } + public var PeerInfo_ButtonUnmute: String { return self._s[3046]! } public func DialogList_SingleUploadingVideoSuffix(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3046]!, self._r[3046]!, [_0]) + return formatWithArgumentRanges(self._s[3047]!, self._r[3047]!, [_0]) } - public var ChatList_PeerTypeChannel: String { return self._s[3047]! } - public var SecretTimer_VideoDescription: String { return self._s[3050]! } - public var WallpaperSearch_ColorRed: String { return self._s[3051]! } - public var GroupPermission_NoPinMessages: String { return self._s[3052]! } - public var Passport_Language_es: String { return self._s[3053]! } - public var Permissions_ContactsAllow_v0: String { return self._s[3055]! } - public var Conversation_EditingMessageMediaEditCurrentVideo: String { return self._s[3056]! } + public var ChatList_PeerTypeChannel: String { return self._s[3048]! } + public var SecretTimer_VideoDescription: String { return self._s[3051]! } + public var WallpaperSearch_ColorRed: String { return self._s[3052]! } + public var GroupPermission_NoPinMessages: String { return self._s[3053]! } + public var Passport_Language_es: String { return self._s[3054]! } + public var Permissions_ContactsAllow_v0: String { return self._s[3056]! } + public var Conversation_EditingMessageMediaEditCurrentVideo: String { return self._s[3057]! } public func PUSH_CHAT_MESSAGE_CONTACT(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3057]!, self._r[3057]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3058]!, self._r[3058]!, [_1, _2]) } - public var Privacy_Forwards_CustomHelp: String { return self._s[3058]! } - public var WebPreview_GettingLinkInfo: String { return self._s[3060]! } - public var Watch_UserInfo_Unmute: String { return self._s[3061]! } - public var GroupInfo_ChannelListNamePlaceholder: String { return self._s[3062]! } - public var AccessDenied_CameraRestricted: String { return self._s[3064]! } + public var Privacy_Forwards_CustomHelp: String { return self._s[3059]! } + public var WebPreview_GettingLinkInfo: String { return self._s[3061]! } + public var Watch_UserInfo_Unmute: String { return self._s[3062]! } + public var GroupInfo_ChannelListNamePlaceholder: String { return self._s[3063]! } + public var AccessDenied_CameraRestricted: String { return self._s[3065]! } public func Conversation_Kilobytes(_ _0: Int) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3065]!, self._r[3065]!, ["\(_0)"]) + return formatWithArgumentRanges(self._s[3066]!, self._r[3066]!, ["\(_0)"]) } - public var ChatList_ReadAll: String { return self._s[3067]! } - public var Settings_CopyUsername: String { return self._s[3068]! } - public var Contacts_SearchLabel: String { return self._s[3069]! } - public var Map_OpenInYandexNavigator: String { return self._s[3071]! } - public var PasscodeSettings_EncryptData: String { return self._s[3072]! } - public var Settings_Wallet: String { return self._s[3073]! } - public var Group_ErrorSupergroupConversionNotPossible: String { return self._s[3074]! } - public var ChatList_PeerTypeBot: String { return self._s[3075]! } - public var WallpaperSearch_ColorPrefix: String { return self._s[3076]! } - public var Notifications_GroupNotificationsPreview: String { return self._s[3077]! } - public var DialogList_AdNoticeAlert: String { return self._s[3078]! } - public var Wallet_Month_GenMay: String { return self._s[3080]! } - public var CheckoutInfo_ShippingInfoAddress1: String { return self._s[3081]! } - public var CheckoutInfo_ShippingInfoAddress2: String { return self._s[3082]! } - public var Localization_LanguageCustom: String { return self._s[3083]! } - public var Passport_Identity_TypeDriversLicenseUploadScan: String { return self._s[3084]! } - public var CallFeedback_Title: String { return self._s[3085]! } - public var VoiceOver_Chat_RecordPreviewVoiceMessage: String { return self._s[3088]! } - public var Passport_Address_OneOfTypePassportRegistration: String { return self._s[3089]! } - public var Wallet_Intro_CreateErrorTitle: String { return self._s[3090]! } - public var Conversation_InfoGroup: String { return self._s[3091]! } - public var Compose_NewMessage: String { return self._s[3092]! } - public var FastTwoStepSetup_HintPlaceholder: String { return self._s[3093]! } - public var ChatSettings_AutoDownloadVideoMessages: String { return self._s[3094]! } - public var Wallet_SecureStorageReset_BiometryFaceId: String { return self._s[3095]! } - public var Channel_DiscussionGroup_UnlinkChannel: String { return self._s[3096]! } + public var ChatList_ReadAll: String { return self._s[3068]! } + public var Settings_CopyUsername: String { return self._s[3069]! } + public var Contacts_SearchLabel: String { return self._s[3070]! } + public var Map_OpenInYandexNavigator: String { return self._s[3072]! } + public var PasscodeSettings_EncryptData: String { return self._s[3073]! } + public var Settings_Wallet: String { return self._s[3074]! } + public var Group_ErrorSupergroupConversionNotPossible: String { return self._s[3075]! } + public var ChatList_PeerTypeBot: String { return self._s[3076]! } + public var WallpaperSearch_ColorPrefix: String { return self._s[3077]! } + public var Notifications_GroupNotificationsPreview: String { return self._s[3078]! } + public var DialogList_AdNoticeAlert: String { return self._s[3079]! } + public var Wallet_Month_GenMay: String { return self._s[3081]! } + public var CheckoutInfo_ShippingInfoAddress1: String { return self._s[3082]! } + public var CheckoutInfo_ShippingInfoAddress2: String { return self._s[3083]! } + public var Localization_LanguageCustom: String { return self._s[3084]! } + public var Passport_Identity_TypeDriversLicenseUploadScan: String { return self._s[3085]! } + public var CallFeedback_Title: String { return self._s[3086]! } + public var VoiceOver_Chat_RecordPreviewVoiceMessage: String { return self._s[3089]! } + public var Passport_Address_OneOfTypePassportRegistration: String { return self._s[3090]! } + public var Wallet_Intro_CreateErrorTitle: String { return self._s[3091]! } + public var Conversation_InfoGroup: String { return self._s[3092]! } + public var Compose_NewMessage: String { return self._s[3093]! } + public var FastTwoStepSetup_HintPlaceholder: String { return self._s[3094]! } + public var ChatSettings_AutoDownloadVideoMessages: String { return self._s[3095]! } + public var Wallet_SecureStorageReset_BiometryFaceId: String { return self._s[3096]! } + public var Channel_DiscussionGroup_UnlinkChannel: String { return self._s[3097]! } public func Passport_Scans_ScanIndex(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3097]!, self._r[3097]!, [_0]) + return formatWithArgumentRanges(self._s[3098]!, self._r[3098]!, [_0]) } - public var Channel_AdminLog_CanDeleteMessages: String { return self._s[3098]! } - public var Login_CancelSignUpConfirmation: String { return self._s[3099]! } - public var ChangePhoneNumberCode_Help: String { return self._s[3100]! } - public var PrivacySettings_DeleteAccountHelp: String { return self._s[3101]! } - public var Channel_BlackList_Title: String { return self._s[3102]! } - public var UserInfo_PhoneCall: String { return self._s[3103]! } - public var Passport_Address_OneOfTypeBankStatement: String { return self._s[3105]! } - public var Wallet_Month_ShortJanuary: String { return self._s[3106]! } - public var State_connecting: String { return self._s[3107]! } - public var Appearance_ThemePreview_ChatList_6_Text: String { return self._s[3108]! } - public var Wallet_Month_GenMarch: String { return self._s[3109]! } - public var EditTheme_Expand_BottomInfo: String { return self._s[3110]! } - public var AuthSessions_AddedDeviceTerminate: String { return self._s[3111]! } + public var Channel_AdminLog_CanDeleteMessages: String { return self._s[3099]! } + public var Login_CancelSignUpConfirmation: String { return self._s[3100]! } + public var ChangePhoneNumberCode_Help: String { return self._s[3101]! } + public var PrivacySettings_DeleteAccountHelp: String { return self._s[3102]! } + public var Channel_BlackList_Title: String { return self._s[3103]! } + public var UserInfo_PhoneCall: String { return self._s[3104]! } + public var Passport_Address_OneOfTypeBankStatement: String { return self._s[3106]! } + public var Wallet_Month_ShortJanuary: String { return self._s[3107]! } + public var State_connecting: String { return self._s[3108]! } + public var Appearance_ThemePreview_ChatList_6_Text: String { return self._s[3109]! } + public var Wallet_Month_GenMarch: String { return self._s[3110]! } + public var EditTheme_Expand_BottomInfo: String { return self._s[3111]! } + public var AuthSessions_AddedDeviceTerminate: String { return self._s[3112]! } public func LastSeen_TodayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3112]!, self._r[3112]!, [_0]) - } - public func DialogList_SingleRecordingAudioSuffix(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[3113]!, self._r[3113]!, [_0]) } - public var Notifications_GroupNotifications: String { return self._s[3114]! } - public var Conversation_SendMessageErrorTooMuchScheduled: String { return self._s[3115]! } - public var Passport_Identity_EditPassport: String { return self._s[3116]! } - public var EnterPasscode_RepeatNewPasscode: String { return self._s[3118]! } - public var Localization_EnglishLanguageName: String { return self._s[3119]! } - public var Share_AuthDescription: String { return self._s[3120]! } - public var SettingsSearch_Synonyms_Notifications_ChannelNotificationsAlert: String { return self._s[3121]! } - public var Passport_Identity_Surname: String { return self._s[3122]! } - public var Compose_TokenListPlaceholder: String { return self._s[3123]! } - public var Wallet_AccessDenied_Camera: String { return self._s[3124]! } - public var Passport_Identity_OneOfTypePassport: String { return self._s[3125]! } - public var Settings_AboutEmpty: String { return self._s[3126]! } - public var Conversation_Unmute: String { return self._s[3127]! } - public var CreateGroup_ChannelsTooMuch: String { return self._s[3129]! } - public var Wallet_Sending_Text: String { return self._s[3130]! } - public func PUSH_CONTACT_JOINED(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3131]!, self._r[3131]!, [_1]) + public func DialogList_SingleRecordingAudioSuffix(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3114]!, self._r[3114]!, [_0]) } - public var Login_CodeSentCall: String { return self._s[3132]! } - public var ContactInfo_PhoneLabelHomeFax: String { return self._s[3134]! } - public var ChatSettings_Appearance: String { return self._s[3135]! } - public var ClearCache_StorageUsage: String { return self._s[3136]! } - public var ChatListFolder_NameContacts: String { return self._s[3137]! } - public var Appearance_PickAccentColor: String { return self._s[3138]! } + public var Notifications_GroupNotifications: String { return self._s[3115]! } + public var Conversation_SendMessageErrorTooMuchScheduled: String { return self._s[3116]! } + public var Passport_Identity_EditPassport: String { return self._s[3117]! } + public var EnterPasscode_RepeatNewPasscode: String { return self._s[3119]! } + public var Localization_EnglishLanguageName: String { return self._s[3120]! } + public var Share_AuthDescription: String { return self._s[3121]! } + public var SettingsSearch_Synonyms_Notifications_ChannelNotificationsAlert: String { return self._s[3122]! } + public var Passport_Identity_Surname: String { return self._s[3123]! } + public var Compose_TokenListPlaceholder: String { return self._s[3124]! } + public var Wallet_AccessDenied_Camera: String { return self._s[3125]! } + public var Passport_Identity_OneOfTypePassport: String { return self._s[3126]! } + public var Settings_AboutEmpty: String { return self._s[3127]! } + public var Conversation_Unmute: String { return self._s[3128]! } + public var CreateGroup_ChannelsTooMuch: String { return self._s[3130]! } + public var Wallet_Sending_Text: String { return self._s[3131]! } + public func PUSH_CONTACT_JOINED(_ _1: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3132]!, self._r[3132]!, [_1]) + } + public var Login_CodeSentCall: String { return self._s[3133]! } + public var ContactInfo_PhoneLabelHomeFax: String { return self._s[3135]! } + public var ChatSettings_Appearance: String { return self._s[3136]! } + public var ClearCache_StorageUsage: String { return self._s[3137]! } + public var ChatListFolder_NameContacts: String { return self._s[3138]! } + public var Appearance_PickAccentColor: String { return self._s[3139]! } public func PUSH_CHAT_MESSAGE_NOTEXT(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3139]!, self._r[3139]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3140]!, self._r[3140]!, [_1, _2]) } public func PUSH_MESSAGE_GEO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3140]!, self._r[3140]!, [_1]) + return formatWithArgumentRanges(self._s[3141]!, self._r[3141]!, [_1]) } - public var Notification_CallMissed: String { return self._s[3141]! } - public var SettingsSearch_Synonyms_Appearance_ChatBackground_Custom: String { return self._s[3142]! } - public var Channel_AdminLogFilter_EventsInfo: String { return self._s[3143]! } - public var Wallet_Month_GenOctober: String { return self._s[3145]! } - public var ChatAdmins_AdminLabel: String { return self._s[3146]! } - public var KeyCommand_JumpToNextChat: String { return self._s[3147]! } - public var Conversation_StopPollConfirmationTitle: String { return self._s[3149]! } - public var ChangePhoneNumberCode_CodePlaceholder: String { return self._s[3150]! } - public var Month_GenJune: String { return self._s[3151]! } - public var IntentsSettings_MainAccountInfo: String { return self._s[3152]! } - public var Watch_Location_Current: String { return self._s[3153]! } - public var Wallet_Receive_CopyInvoiceUrl: String { return self._s[3154]! } - public var Conversation_TitleMute: String { return self._s[3155]! } - public var Map_PlacesInThisArea: String { return self._s[3156]! } + public var Notification_CallMissed: String { return self._s[3142]! } + public var SettingsSearch_Synonyms_Appearance_ChatBackground_Custom: String { return self._s[3143]! } + public var Channel_AdminLogFilter_EventsInfo: String { return self._s[3144]! } + public var Wallet_Month_GenOctober: String { return self._s[3146]! } + public var ChatAdmins_AdminLabel: String { return self._s[3147]! } + public var KeyCommand_JumpToNextChat: String { return self._s[3148]! } + public var Conversation_StopPollConfirmationTitle: String { return self._s[3150]! } + public var ChangePhoneNumberCode_CodePlaceholder: String { return self._s[3151]! } + public var Month_GenJune: String { return self._s[3152]! } + public var IntentsSettings_MainAccountInfo: String { return self._s[3153]! } + public var Watch_Location_Current: String { return self._s[3154]! } + public var Wallet_Receive_CopyInvoiceUrl: String { return self._s[3155]! } + public var Conversation_TitleMute: String { return self._s[3156]! } + public var Map_PlacesInThisArea: String { return self._s[3157]! } public func PUSH_CHANNEL_MESSAGE_ROUND(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3157]!, self._r[3157]!, [_1]) + return formatWithArgumentRanges(self._s[3158]!, self._r[3158]!, [_1]) } - public var GroupInfo_DeleteAndExit: String { return self._s[3158]! } + public var GroupInfo_DeleteAndExit: String { return self._s[3159]! } public func Conversation_Moderate_DeleteAllMessages(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3159]!, self._r[3159]!, [_0]) + return formatWithArgumentRanges(self._s[3160]!, self._r[3160]!, [_0]) } - public var Call_ReportPlaceholder: String { return self._s[3160]! } - public var Chat_SlowmodeSendError: String { return self._s[3161]! } - public var MaskStickerSettings_Info: String { return self._s[3162]! } - public var EditTheme_Expand_TopInfo: String { return self._s[3163]! } + public var Call_ReportPlaceholder: String { return self._s[3161]! } + public var Chat_SlowmodeSendError: String { return self._s[3162]! } + public var MaskStickerSettings_Info: String { return self._s[3163]! } + public var EditTheme_Expand_TopInfo: String { return self._s[3164]! } public func GroupInfo_AddParticipantConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3164]!, self._r[3164]!, [_0]) + return formatWithArgumentRanges(self._s[3165]!, self._r[3165]!, [_0]) } - public var Checkout_NewCard_PostcodeTitle: String { return self._s[3165]! } - public var Passport_Address_RegionPlaceholder: String { return self._s[3167]! } - public var Contacts_ShareTelegram: String { return self._s[3168]! } - public var EnterPasscode_EnterNewPasscodeNew: String { return self._s[3169]! } - public var Map_AddressOnMap: String { return self._s[3170]! } - public var Channel_ErrorAccessDenied: String { return self._s[3171]! } - public var UserInfo_ScamBotWarning: String { return self._s[3173]! } - public var Stickers_GroupChooseStickerPack: String { return self._s[3174]! } - public var Call_ConnectionErrorTitle: String { return self._s[3175]! } - public var UserInfo_NotificationsEnable: String { return self._s[3176]! } - public var ArchivedChats_IntroText1: String { return self._s[3177]! } - public var Tour_Text4: String { return self._s[3180]! } - public var WallpaperSearch_Recent: String { return self._s[3181]! } - public var GroupInfo_ScamGroupWarning: String { return self._s[3182]! } - public var PeopleNearby_MakeVisibleTitle: String { return self._s[3183]! } - public var Profile_MessageLifetime2s: String { return self._s[3185]! } - public var Appearance_ThemePreview_ChatList_5_Text: String { return self._s[3186]! } - public var Notification_MessageLifetime2s: String { return self._s[3187]! } + public var Checkout_NewCard_PostcodeTitle: String { return self._s[3166]! } + public var Passport_Address_RegionPlaceholder: String { return self._s[3168]! } + public var Contacts_ShareTelegram: String { return self._s[3169]! } + public var EnterPasscode_EnterNewPasscodeNew: String { return self._s[3170]! } + public var Map_AddressOnMap: String { return self._s[3171]! } + public var Channel_ErrorAccessDenied: String { return self._s[3172]! } + public var UserInfo_ScamBotWarning: String { return self._s[3174]! } + public var Stickers_GroupChooseStickerPack: String { return self._s[3175]! } + public var Call_ConnectionErrorTitle: String { return self._s[3176]! } + public var UserInfo_NotificationsEnable: String { return self._s[3177]! } + public var ArchivedChats_IntroText1: String { return self._s[3178]! } + public var Tour_Text4: String { return self._s[3181]! } + public var WallpaperSearch_Recent: String { return self._s[3182]! } + public var GroupInfo_ScamGroupWarning: String { return self._s[3183]! } + public var PeopleNearby_MakeVisibleTitle: String { return self._s[3184]! } + public var Profile_MessageLifetime2s: String { return self._s[3186]! } + public var Appearance_ThemePreview_ChatList_5_Text: String { return self._s[3187]! } + public var Notification_MessageLifetime2s: String { return self._s[3188]! } public func Time_PreciseDate_m10(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3188]!, self._r[3188]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[3189]!, self._r[3189]!, [_1, _2, _3]) } - public var Cache_ClearCache: String { return self._s[3189]! } - public var AutoNightTheme_UpdateLocation: String { return self._s[3190]! } - public var Permissions_NotificationsUnreachableText_v0: String { return self._s[3191]! } + public var Cache_ClearCache: String { return self._s[3190]! } + public var AutoNightTheme_UpdateLocation: String { return self._s[3191]! } + public var Permissions_NotificationsUnreachableText_v0: String { return self._s[3192]! } public func Channel_AdminLog_MessageChangedGroupUsername(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3195]!, self._r[3195]!, [_0]) + return formatWithArgumentRanges(self._s[3196]!, self._r[3196]!, [_0]) } public func Conversation_ShareMyPhoneNumber_StatusSuccess(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3197]!, self._r[3197]!, [_0]) + return formatWithArgumentRanges(self._s[3198]!, self._r[3198]!, [_0]) } - public var LocalGroup_Text: String { return self._s[3198]! } - public var PeerInfo_PaneMembers: String { return self._s[3199]! } - public var Channel_AdminLog_EmptyFilterTitle: String { return self._s[3200]! } - public var SocksProxySetup_TypeSocks: String { return self._s[3201]! } - public var ChatList_UnarchiveAction: String { return self._s[3202]! } - public var AutoNightTheme_Title: String { return self._s[3203]! } - public var InstantPage_FeedbackButton: String { return self._s[3204]! } - public var Passport_FieldAddress: String { return self._s[3205]! } + public var LocalGroup_Text: String { return self._s[3199]! } + public var PeerInfo_PaneMembers: String { return self._s[3200]! } + public var Channel_AdminLog_EmptyFilterTitle: String { return self._s[3201]! } + public var SocksProxySetup_TypeSocks: String { return self._s[3202]! } + public var ChatList_UnarchiveAction: String { return self._s[3203]! } + public var AutoNightTheme_Title: String { return self._s[3204]! } + public var InstantPage_FeedbackButton: String { return self._s[3205]! } + public var Passport_FieldAddress: String { return self._s[3206]! } public func Channel_AdminLog_SetSlowmode(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3206]!, self._r[3206]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3207]!, self._r[3207]!, [_1, _2]) } - public var Month_ShortMarch: String { return self._s[3207]! } + public var Month_ShortMarch: String { return self._s[3208]! } public func PUSH_MESSAGE_INVOICE(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3208]!, self._r[3208]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3209]!, self._r[3209]!, [_1, _2]) } - public var SocksProxySetup_UsernamePlaceholder: String { return self._s[3209]! } - public var Conversation_ShareInlineBotLocationConfirmation: String { return self._s[3210]! } - public var Passport_FloodError: String { return self._s[3211]! } - public var SecretGif_Title: String { return self._s[3213]! } - public var NotificationSettings_ShowNotificationsAllAccountsInfoOn: String { return self._s[3214]! } - public var ChatList_Context_UnhideArchive: String { return self._s[3215]! } - public var Passport_Language_th: String { return self._s[3217]! } - public var Passport_Address_Address: String { return self._s[3218]! } - public var Login_InvalidLastNameError: String { return self._s[3219]! } - public var Notifications_InAppNotificationsPreview: String { return self._s[3220]! } - public var Notifications_PermissionsUnreachableTitle: String { return self._s[3221]! } - public var ChatList_Context_Archive: String { return self._s[3222]! } - public var SettingsSearch_FAQ: String { return self._s[3223]! } - public var ShareMenu_Send: String { return self._s[3224]! } - public var ChatState_Connecting: String { return self._s[3225]! } - public var WallpaperSearch_ColorYellow: String { return self._s[3227]! } - public var Month_GenNovember: String { return self._s[3229]! } - public var SettingsSearch_Synonyms_Appearance_LargeEmoji: String { return self._s[3231]! } + public var SocksProxySetup_UsernamePlaceholder: String { return self._s[3210]! } + public var Conversation_ShareInlineBotLocationConfirmation: String { return self._s[3211]! } + public var Passport_FloodError: String { return self._s[3212]! } + public var SecretGif_Title: String { return self._s[3214]! } + public var NotificationSettings_ShowNotificationsAllAccountsInfoOn: String { return self._s[3215]! } + public var ChatList_Context_UnhideArchive: String { return self._s[3216]! } + public var Passport_Language_th: String { return self._s[3218]! } + public var Passport_Address_Address: String { return self._s[3219]! } + public var Login_InvalidLastNameError: String { return self._s[3220]! } + public var Notifications_InAppNotificationsPreview: String { return self._s[3221]! } + public var Notifications_PermissionsUnreachableTitle: String { return self._s[3222]! } + public var ChatList_Context_Archive: String { return self._s[3223]! } + public var SettingsSearch_FAQ: String { return self._s[3224]! } + public var ShareMenu_Send: String { return self._s[3225]! } + public var ChatState_Connecting: String { return self._s[3226]! } + public var WallpaperSearch_ColorYellow: String { return self._s[3228]! } + public var Month_GenNovember: String { return self._s[3230]! } + public var SettingsSearch_Synonyms_Appearance_LargeEmoji: String { return self._s[3232]! } public func Conversation_ShareMyPhoneNumberConfirmation(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3232]!, self._r[3232]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3233]!, self._r[3233]!, [_1, _2]) } - public var ChatListFolder_CategoryChannels: String { return self._s[3233]! } - public var Conversation_SwipeToReplyHintText: String { return self._s[3234]! } - public var Checkout_Email: String { return self._s[3235]! } - public var NotificationsSound_Tritone: String { return self._s[3236]! } - public var StickerPacksSettings_ManagingHelp: String { return self._s[3238]! } - public var Wallet_ContextMenuCopy: String { return self._s[3240]! } + public var ChatListFolder_CategoryChannels: String { return self._s[3234]! } + public var Conversation_SwipeToReplyHintText: String { return self._s[3235]! } + public var Checkout_Email: String { return self._s[3236]! } + public var NotificationsSound_Tritone: String { return self._s[3237]! } + public var StickerPacksSettings_ManagingHelp: String { return self._s[3239]! } + public var Wallet_ContextMenuCopy: String { return self._s[3241]! } public func Wallet_Time_PreciseDate_m6(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3242]!, self._r[3242]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[3243]!, self._r[3243]!, [_1, _2, _3]) } - public var Appearance_TextSize_Automatic: String { return self._s[3243]! } - public var Stickers_Installed: String { return self._s[3245]! } + public var Appearance_TextSize_Automatic: String { return self._s[3244]! } + public var Stickers_Installed: String { return self._s[3246]! } public func PUSH_PINNED_ROUND(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3246]!, self._r[3246]!, [_1]) + return formatWithArgumentRanges(self._s[3247]!, self._r[3247]!, [_1]) } public func StickerPackActionInfo_AddedText(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3247]!, self._r[3247]!, [_0]) + return formatWithArgumentRanges(self._s[3248]!, self._r[3248]!, [_0]) } - public var ChangePhoneNumberNumber_Help: String { return self._s[3248]! } + public var ChangePhoneNumberNumber_Help: String { return self._s[3249]! } public func Checkout_LiabilityAlert(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3249]!, self._r[3249]!, [_1, _1, _1, _2]) + return formatWithArgumentRanges(self._s[3250]!, self._r[3250]!, [_1, _1, _1, _2]) } - public var ChatList_UndoArchiveTitle: String { return self._s[3250]! } - public var Notification_Exceptions_Add: String { return self._s[3251]! } - public var DialogList_You: String { return self._s[3252]! } - public var MediaPicker_Send: String { return self._s[3255]! } - public var SettingsSearch_Synonyms_Stickers_Title: String { return self._s[3256]! } - public var Appearance_ThemePreview_ChatList_4_Text: String { return self._s[3257]! } - public var Call_AudioRouteSpeaker: String { return self._s[3258]! } - public var Watch_UserInfo_Title: String { return self._s[3259]! } - public var VoiceOver_Chat_PollFinalResults: String { return self._s[3260]! } - public var Appearance_AccentColor: String { return self._s[3262]! } + public var ChatList_UndoArchiveTitle: String { return self._s[3251]! } + public var Notification_Exceptions_Add: String { return self._s[3252]! } + public var DialogList_You: String { return self._s[3253]! } + public var MediaPicker_Send: String { return self._s[3256]! } + public var SettingsSearch_Synonyms_Stickers_Title: String { return self._s[3257]! } + public var Appearance_ThemePreview_ChatList_4_Text: String { return self._s[3258]! } + public var Call_AudioRouteSpeaker: String { return self._s[3259]! } + public var Watch_UserInfo_Title: String { return self._s[3260]! } + public var VoiceOver_Chat_PollFinalResults: String { return self._s[3261]! } + public var Appearance_AccentColor: String { return self._s[3263]! } public func Login_EmailPhoneSubject(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3263]!, self._r[3263]!, [_0]) + return formatWithArgumentRanges(self._s[3264]!, self._r[3264]!, [_0]) } - public var Permissions_ContactsAllowInSettings_v0: String { return self._s[3264]! } + public var Permissions_ContactsAllowInSettings_v0: String { return self._s[3265]! } public func PUSH_CHANNEL_MESSAGE_GAME(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3265]!, self._r[3265]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3266]!, self._r[3266]!, [_1, _2]) } - public var Conversation_ClousStorageInfo_Description2: String { return self._s[3266]! } - public var WebSearch_RecentClearConfirmation: String { return self._s[3267]! } - public var Notification_CallOutgoing: String { return self._s[3268]! } - public var PrivacySettings_PasscodeAndFaceId: String { return self._s[3269]! } - public var Channel_DiscussionGroup_MakeHistoryPublic: String { return self._s[3270]! } - public var Call_RecordingDisabledMessage: String { return self._s[3271]! } - public var Message_Game: String { return self._s[3272]! } - public var Conversation_PressVolumeButtonForSound: String { return self._s[3273]! } - public var PrivacyLastSeenSettings_CustomHelp: String { return self._s[3274]! } - public var Channel_DiscussionGroup_PrivateGroup: String { return self._s[3275]! } - public var Channel_EditAdmin_PermissionAddAdmins: String { return self._s[3276]! } - public var Date_DialogDateFormat: String { return self._s[3278]! } - public var WallpaperColors_SetCustomColor: String { return self._s[3279]! } - public var Notifications_InAppNotifications: String { return self._s[3280]! } + public var Conversation_ClousStorageInfo_Description2: String { return self._s[3267]! } + public var WebSearch_RecentClearConfirmation: String { return self._s[3268]! } + public var Notification_CallOutgoing: String { return self._s[3269]! } + public var PrivacySettings_PasscodeAndFaceId: String { return self._s[3270]! } + public var Channel_DiscussionGroup_MakeHistoryPublic: String { return self._s[3271]! } + public var Call_RecordingDisabledMessage: String { return self._s[3272]! } + public var Message_Game: String { return self._s[3273]! } + public var Conversation_PressVolumeButtonForSound: String { return self._s[3274]! } + public var PrivacyLastSeenSettings_CustomHelp: String { return self._s[3275]! } + public var Channel_DiscussionGroup_PrivateGroup: String { return self._s[3276]! } + public var Channel_EditAdmin_PermissionAddAdmins: String { return self._s[3277]! } + public var Date_DialogDateFormat: String { return self._s[3279]! } + public var WallpaperColors_SetCustomColor: String { return self._s[3280]! } + public var Notifications_InAppNotifications: String { return self._s[3281]! } public func Channel_Management_RemovedBy(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3281]!, self._r[3281]!, [_0]) + return formatWithArgumentRanges(self._s[3282]!, self._r[3282]!, [_0]) } public func Settings_ApplyProxyAlert(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3282]!, self._r[3282]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3283]!, self._r[3283]!, [_1, _2]) } - public var NewContact_Title: String { return self._s[3283]! } + public var NewContact_Title: String { return self._s[3284]! } public func AutoDownloadSettings_UpToForAll(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3284]!, self._r[3284]!, [_0]) + return formatWithArgumentRanges(self._s[3285]!, self._r[3285]!, [_0]) } - public var Conversation_ViewContactDetails: String { return self._s[3285]! } + public var Conversation_ViewContactDetails: String { return self._s[3286]! } public func PUSH_CHANNEL_MESSAGE_CONTACT(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3287]!, self._r[3287]!, [_1]) + return formatWithArgumentRanges(self._s[3288]!, self._r[3288]!, [_1]) } - public var Checkout_NewCard_CardholderNameTitle: String { return self._s[3288]! } - public var Passport_Identity_ExpiryDateNone: String { return self._s[3289]! } - public var PrivacySettings_Title: String { return self._s[3290]! } - public var Conversation_SilentBroadcastTooltipOff: String { return self._s[3293]! } - public var GroupRemoved_UsersSectionTitle: String { return self._s[3294]! } - public var VoiceOver_Chat_ContactEmail: String { return self._s[3295]! } - public var Contacts_PhoneNumber: String { return self._s[3296]! } - public var PeerInfo_ButtonMute: String { return self._s[3297]! } - public var TwoFactorSetup_Password_PlaceholderConfirmPassword: String { return self._s[3299]! } - public var Map_ShowPlaces: String { return self._s[3300]! } - public var ChatAdmins_Title: String { return self._s[3301]! } - public var InstantPage_Reference: String { return self._s[3303]! } - public var Wallet_Info_Updating: String { return self._s[3304]! } - public var ReportGroupLocation_Text: String { return self._s[3305]! } + public var Checkout_NewCard_CardholderNameTitle: String { return self._s[3289]! } + public var Passport_Identity_ExpiryDateNone: String { return self._s[3290]! } + public var PrivacySettings_Title: String { return self._s[3291]! } + public var Conversation_SilentBroadcastTooltipOff: String { return self._s[3294]! } + public var GroupRemoved_UsersSectionTitle: String { return self._s[3295]! } + public var VoiceOver_Chat_ContactEmail: String { return self._s[3296]! } + public var Contacts_PhoneNumber: String { return self._s[3297]! } + public var PeerInfo_ButtonMute: String { return self._s[3298]! } + public var TwoFactorSetup_Password_PlaceholderConfirmPassword: String { return self._s[3300]! } + public var Map_ShowPlaces: String { return self._s[3301]! } + public var ChatAdmins_Title: String { return self._s[3302]! } + public var InstantPage_Reference: String { return self._s[3304]! } + public var Wallet_Info_Updating: String { return self._s[3305]! } + public var ReportGroupLocation_Text: String { return self._s[3306]! } public func PUSH_CHAT_MESSAGE_FWD(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3306]!, self._r[3306]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3307]!, self._r[3307]!, [_1, _2]) } - public var Camera_FlashOff: String { return self._s[3307]! } - public var Watch_UserInfo_Block: String { return self._s[3308]! } - public var ChatSettings_Stickers: String { return self._s[3309]! } - public var ChatSettings_DownloadInBackground: String { return self._s[3310]! } - public var Appearance_ThemeCarouselTintedNight: String { return self._s[3311]! } + public var Camera_FlashOff: String { return self._s[3308]! } + public var Watch_UserInfo_Block: String { return self._s[3309]! } + public var ChatSettings_Stickers: String { return self._s[3310]! } + public var ChatSettings_DownloadInBackground: String { return self._s[3311]! } + public var Appearance_ThemeCarouselTintedNight: String { return self._s[3312]! } public func UserInfo_BlockConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3312]!, self._r[3312]!, [_0]) + return formatWithArgumentRanges(self._s[3313]!, self._r[3313]!, [_0]) } - public var Settings_ViewPhoto: String { return self._s[3313]! } - public var Login_CheckOtherSessionMessages: String { return self._s[3314]! } - public var AutoDownloadSettings_Cellular: String { return self._s[3315]! } - public var Wallet_Created_ExportErrorTitle: String { return self._s[3316]! } - public var SettingsSearch_Synonyms_Notifications_GroupNotificationsExceptions: String { return self._s[3317]! } - public var VoiceOver_MessageContextShare: String { return self._s[3318]! } + public var Settings_ViewPhoto: String { return self._s[3314]! } + public var Login_CheckOtherSessionMessages: String { return self._s[3315]! } + public var AutoDownloadSettings_Cellular: String { return self._s[3316]! } + public var Wallet_Created_ExportErrorTitle: String { return self._s[3317]! } + public var SettingsSearch_Synonyms_Notifications_GroupNotificationsExceptions: String { return self._s[3318]! } + public var VoiceOver_MessageContextShare: String { return self._s[3319]! } public func Target_InviteToGroupConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3320]!, self._r[3320]!, [_0]) + return formatWithArgumentRanges(self._s[3321]!, self._r[3321]!, [_0]) } - public var Privacy_DeleteDrafts: String { return self._s[3321]! } - public var Wallpaper_SetCustomBackgroundInfo: String { return self._s[3322]! } + public var Privacy_DeleteDrafts: String { return self._s[3322]! } + public var Wallpaper_SetCustomBackgroundInfo: String { return self._s[3323]! } public func LastSeen_AtDate(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3323]!, self._r[3323]!, [_0]) + return formatWithArgumentRanges(self._s[3324]!, self._r[3324]!, [_0]) } - public var DialogList_SavedMessagesHelp: String { return self._s[3324]! } - public var Wallet_SecureStorageNotAvailable_Title: String { return self._s[3325]! } - public var DialogList_SavedMessages: String { return self._s[3326]! } - public var GroupInfo_UpgradeButton: String { return self._s[3327]! } - public var Appearance_ThemePreview_ChatList_3_Text: String { return self._s[3329]! } - public var DialogList_Pin: String { return self._s[3330]! } + public var DialogList_SavedMessagesHelp: String { return self._s[3325]! } + public var Wallet_SecureStorageNotAvailable_Title: String { return self._s[3326]! } + public var DialogList_SavedMessages: String { return self._s[3327]! } + public var GroupInfo_UpgradeButton: String { return self._s[3328]! } + public var Appearance_ThemePreview_ChatList_3_Text: String { return self._s[3330]! } + public var DialogList_Pin: String { return self._s[3331]! } public func ForwardedAuthors2(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3331]!, self._r[3331]!, [_0, _1]) + return formatWithArgumentRanges(self._s[3332]!, self._r[3332]!, [_0, _1]) } public func Login_PhoneGenericEmailSubject(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3332]!, self._r[3332]!, [_0]) + return formatWithArgumentRanges(self._s[3333]!, self._r[3333]!, [_0]) } - public var Notification_Exceptions_AlwaysOn: String { return self._s[3333]! } - public var UserInfo_NotificationsDisable: String { return self._s[3334]! } - public var Conversation_ContextMenuCancelEditing: String { return self._s[3335]! } - public var Paint_Outlined: String { return self._s[3336]! } - public var Activity_PlayingGame: String { return self._s[3337]! } - public var SearchImages_NoImagesFound: String { return self._s[3338]! } - public var SocksProxySetup_ProxyType: String { return self._s[3339]! } - public var AppleWatch_ReplyPresetsHelp: String { return self._s[3341]! } - public var Conversation_ContextMenuCancelSending: String { return self._s[3342]! } - public var Settings_AppLanguage: String { return self._s[3343]! } - public var TwoStepAuth_ResetAccountHelp: String { return self._s[3344]! } - public var Common_ChoosePhoto: String { return self._s[3345]! } - public var AuthSessions_AddDevice_InvalidQRCode: String { return self._s[3346]! } - public var CallFeedback_ReasonEcho: String { return self._s[3347]! } + public var Notification_Exceptions_AlwaysOn: String { return self._s[3334]! } + public var UserInfo_NotificationsDisable: String { return self._s[3335]! } + public var Conversation_ContextMenuCancelEditing: String { return self._s[3336]! } + public var Paint_Outlined: String { return self._s[3337]! } + public var Activity_PlayingGame: String { return self._s[3338]! } + public var SearchImages_NoImagesFound: String { return self._s[3339]! } + public var SocksProxySetup_ProxyType: String { return self._s[3340]! } + public var AppleWatch_ReplyPresetsHelp: String { return self._s[3342]! } + public var Conversation_ContextMenuCancelSending: String { return self._s[3343]! } + public var Settings_AppLanguage: String { return self._s[3344]! } + public var TwoStepAuth_ResetAccountHelp: String { return self._s[3345]! } + public var Common_ChoosePhoto: String { return self._s[3346]! } + public var AuthSessions_AddDevice_InvalidQRCode: String { return self._s[3347]! } + public var CallFeedback_ReasonEcho: String { return self._s[3348]! } public func PUSH_PINNED_AUDIO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3348]!, self._r[3348]!, [_1]) + return formatWithArgumentRanges(self._s[3349]!, self._r[3349]!, [_1]) } - public var Privacy_Calls_AlwaysAllow: String { return self._s[3349]! } - public var PollResults_Collapse: String { return self._s[3350]! } - public var Activity_UploadingVideo: String { return self._s[3351]! } - public var Conversation_WalletRequiredNotNow: String { return self._s[3352]! } - public var ChannelInfo_DeleteChannelConfirmation: String { return self._s[3353]! } - public var NetworkUsageSettings_Wifi: String { return self._s[3354]! } - public var VoiceOver_Editing_ClearText: String { return self._s[3355]! } - public var PUSH_SENDER_YOU: String { return self._s[3356]! } - public var Channel_BanUser_PermissionReadMessages: String { return self._s[3357]! } - public var Checkout_PayWithTouchId: String { return self._s[3358]! } - public var Wallpaper_ResetWallpapersConfirmation: String { return self._s[3359]! } + public var Privacy_Calls_AlwaysAllow: String { return self._s[3350]! } + public var PollResults_Collapse: String { return self._s[3351]! } + public var Activity_UploadingVideo: String { return self._s[3352]! } + public var Conversation_WalletRequiredNotNow: String { return self._s[3353]! } + public var ChannelInfo_DeleteChannelConfirmation: String { return self._s[3354]! } + public var NetworkUsageSettings_Wifi: String { return self._s[3355]! } + public var VoiceOver_Editing_ClearText: String { return self._s[3356]! } + public var PUSH_SENDER_YOU: String { return self._s[3357]! } + public var Channel_BanUser_PermissionReadMessages: String { return self._s[3358]! } + public var Checkout_PayWithTouchId: String { return self._s[3359]! } + public var Wallpaper_ResetWallpapersConfirmation: String { return self._s[3360]! } public func PUSH_LOCKED_MESSAGE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3361]!, self._r[3361]!, [_1]) + return formatWithArgumentRanges(self._s[3362]!, self._r[3362]!, [_1]) } - public var Notifications_ExceptionsNone: String { return self._s[3362]! } + public var Notifications_ExceptionsNone: String { return self._s[3363]! } public func Message_ForwardedMessageShort(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3363]!, self._r[3363]!, [_0]) + return formatWithArgumentRanges(self._s[3364]!, self._r[3364]!, [_0]) } public func PUSH_PINNED_GEO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3364]!, self._r[3364]!, [_1]) + return formatWithArgumentRanges(self._s[3365]!, self._r[3365]!, [_1]) } - public var AuthSessions_IncompleteAttempts: String { return self._s[3366]! } - public var Passport_Address_Region: String { return self._s[3369]! } - public var ChatList_DeleteChat: String { return self._s[3370]! } - public var LogoutOptions_ClearCacheTitle: String { return self._s[3371]! } - public var PhotoEditor_TiltShift: String { return self._s[3372]! } - public var Settings_FAQ_URL: String { return self._s[3373]! } - public var TwoFactorSetup_EmailVerification_ChangeAction: String { return self._s[3374]! } - public var Passport_Language_sl: String { return self._s[3376]! } - public var Settings_PrivacySettings: String { return self._s[3378]! } - public var SharedMedia_TitleLink: String { return self._s[3379]! } - public var Passport_Identity_TypePassportUploadScan: String { return self._s[3380]! } - public var Settings_SetProfilePhoto: String { return self._s[3381]! } - public var Channel_About_Help: String { return self._s[3382]! } - public var Contacts_PermissionsEnable: String { return self._s[3383]! } - public var Wallet_Sending_Title: String { return self._s[3384]! } - public var PeerInfo_PaneMedia: String { return self._s[3385]! } - public var SettingsSearch_Synonyms_Notifications_GroupNotificationsAlert: String { return self._s[3386]! } - public var AttachmentMenu_SendAsFiles: String { return self._s[3387]! } - public var CallFeedback_ReasonInterruption: String { return self._s[3389]! } - public var Passport_Address_AddTemporaryRegistration: String { return self._s[3390]! } - public var AutoDownloadSettings_AutodownloadVideos: String { return self._s[3391]! } - public var ChatSettings_AutoDownloadSettings_Delimeter: String { return self._s[3392]! } - public var OldChannels_Title: String { return self._s[3393]! } - public var PrivacySettings_DeleteAccountTitle: String { return self._s[3394]! } - public var AccessDenied_VideoMessageCamera: String { return self._s[3396]! } - public var Map_OpenInYandexMaps: String { return self._s[3398]! } - public var CreateGroup_ErrorLocatedGroupsTooMuch: String { return self._s[3399]! } - public var VoiceOver_MessageContextReply: String { return self._s[3400]! } - public var ChatListFolder_DiscardConfirmation: String { return self._s[3402]! } - public var PhotoEditor_SaturationTool: String { return self._s[3403]! } + public var AuthSessions_IncompleteAttempts: String { return self._s[3367]! } + public var Passport_Address_Region: String { return self._s[3370]! } + public var ChatList_DeleteChat: String { return self._s[3371]! } + public var LogoutOptions_ClearCacheTitle: String { return self._s[3372]! } + public var PhotoEditor_TiltShift: String { return self._s[3373]! } + public var Settings_FAQ_URL: String { return self._s[3374]! } + public var TwoFactorSetup_EmailVerification_ChangeAction: String { return self._s[3375]! } + public var Passport_Language_sl: String { return self._s[3377]! } + public var Settings_PrivacySettings: String { return self._s[3379]! } + public var SharedMedia_TitleLink: String { return self._s[3380]! } + public var Passport_Identity_TypePassportUploadScan: String { return self._s[3381]! } + public var Settings_SetProfilePhoto: String { return self._s[3382]! } + public var Channel_About_Help: String { return self._s[3383]! } + public var Contacts_PermissionsEnable: String { return self._s[3384]! } + public var Wallet_Sending_Title: String { return self._s[3385]! } + public var PeerInfo_PaneMedia: String { return self._s[3386]! } + public var SettingsSearch_Synonyms_Notifications_GroupNotificationsAlert: String { return self._s[3387]! } + public var AttachmentMenu_SendAsFiles: String { return self._s[3388]! } + public var CallFeedback_ReasonInterruption: String { return self._s[3390]! } + public var Passport_Address_AddTemporaryRegistration: String { return self._s[3391]! } + public var AutoDownloadSettings_AutodownloadVideos: String { return self._s[3392]! } + public var ChatSettings_AutoDownloadSettings_Delimeter: String { return self._s[3393]! } + public var OldChannels_Title: String { return self._s[3394]! } + public var PrivacySettings_DeleteAccountTitle: String { return self._s[3395]! } + public var AccessDenied_VideoMessageCamera: String { return self._s[3397]! } + public var Map_OpenInYandexMaps: String { return self._s[3399]! } + public var CreateGroup_ErrorLocatedGroupsTooMuch: String { return self._s[3400]! } + public var VoiceOver_MessageContextReply: String { return self._s[3401]! } + public var ChatListFolder_DiscardConfirmation: String { return self._s[3403]! } + public var PhotoEditor_SaturationTool: String { return self._s[3404]! } public func PUSH_MESSAGE_STICKER(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3404]!, self._r[3404]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3405]!, self._r[3405]!, [_1, _2]) } - public var PrivacyPhoneNumberSettings_CustomHelp: String { return self._s[3405]! } - public var Notification_Exceptions_NewException_NotificationHeader: String { return self._s[3406]! } - public var Group_OwnershipTransfer_ErrorLocatedGroupsTooMuch: String { return self._s[3407]! } + public var PrivacyPhoneNumberSettings_CustomHelp: String { return self._s[3406]! } + public var Notification_Exceptions_NewException_NotificationHeader: String { return self._s[3407]! } + public var Group_OwnershipTransfer_ErrorLocatedGroupsTooMuch: String { return self._s[3408]! } public func LOCAL_MESSAGE_FWDS(_ _1: String, _ _2: Int) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3408]!, self._r[3408]!, [_1, "\(_2)"]) + return formatWithArgumentRanges(self._s[3409]!, self._r[3409]!, [_1, "\(_2)"]) } - public var Appearance_ThemePreview_ChatList_2_Text: String { return self._s[3409]! } - public var Channel_Username_InvalidTooShort: String { return self._s[3411]! } - public var SettingsSearch_Synonyms_Wallet: String { return self._s[3412]! } + public var Appearance_ThemePreview_ChatList_2_Text: String { return self._s[3410]! } + public var Channel_Username_InvalidTooShort: String { return self._s[3412]! } + public var SettingsSearch_Synonyms_Wallet: String { return self._s[3413]! } public func Group_OwnershipTransfer_DescriptionInfo(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3413]!, self._r[3413]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3414]!, self._r[3414]!, [_1, _2]) } - public var Forward_ErrorPublicPollDisabledInChannels: String { return self._s[3414]! } + public var Forward_ErrorPublicPollDisabledInChannels: String { return self._s[3415]! } public func PUSH_CHAT_MESSAGE_GAME(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3415]!, self._r[3415]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[3416]!, self._r[3416]!, [_1, _2, _3]) } - public var WallpaperPreview_PatternTitle: String { return self._s[3416]! } - public var GroupInfo_PublicLinkAdd: String { return self._s[3417]! } - public var Passport_PassportInformation: String { return self._s[3420]! } - public var Theme_Unsupported: String { return self._s[3421]! } - public var WatchRemote_AlertTitle: String { return self._s[3422]! } - public var Privacy_GroupsAndChannels_NeverAllow: String { return self._s[3423]! } - public var ConvertToSupergroup_HelpText: String { return self._s[3425]! } + public var WallpaperPreview_PatternTitle: String { return self._s[3417]! } + public var GroupInfo_PublicLinkAdd: String { return self._s[3418]! } + public var Passport_PassportInformation: String { return self._s[3421]! } + public var Theme_Unsupported: String { return self._s[3422]! } + public var WatchRemote_AlertTitle: String { return self._s[3423]! } + public var Privacy_GroupsAndChannels_NeverAllow: String { return self._s[3424]! } + public var ConvertToSupergroup_HelpText: String { return self._s[3426]! } public func Time_MonthOfYear_m7(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3426]!, self._r[3426]!, [_0]) + return formatWithArgumentRanges(self._s[3427]!, self._r[3427]!, [_0]) } public func PUSH_PHONE_CALL_REQUEST(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3427]!, self._r[3427]!, [_1]) + return formatWithArgumentRanges(self._s[3428]!, self._r[3428]!, [_1]) } - public var Privacy_GroupsAndChannels_CustomHelp: String { return self._s[3428]! } - public var Wallet_Navigation_Done: String { return self._s[3430]! } - public var TwoStepAuth_RecoveryCodeInvalid: String { return self._s[3431]! } - public var AccessDenied_CameraDisabled: String { return self._s[3432]! } + public var Privacy_GroupsAndChannels_CustomHelp: String { return self._s[3429]! } + public var Wallet_Navigation_Done: String { return self._s[3431]! } + public var TwoStepAuth_RecoveryCodeInvalid: String { return self._s[3432]! } + public var AccessDenied_CameraDisabled: String { return self._s[3433]! } public func Channel_Username_UsernameIsAvailable(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3433]!, self._r[3433]!, [_0]) + return formatWithArgumentRanges(self._s[3434]!, self._r[3434]!, [_0]) } - public var ClearCache_Forever: String { return self._s[3434]! } - public var AuthSessions_AddDeviceIntro_Title: String { return self._s[3435]! } - public var CreatePoll_Quiz: String { return self._s[3436]! } - public var PhotoEditor_ContrastTool: String { return self._s[3439]! } + public var ClearCache_Forever: String { return self._s[3435]! } + public var AuthSessions_AddDeviceIntro_Title: String { return self._s[3436]! } + public var CreatePoll_Quiz: String { return self._s[3437]! } + public var PhotoEditor_ContrastTool: String { return self._s[3440]! } public func PUSH_PINNED_DOC(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3440]!, self._r[3440]!, [_1]) + return formatWithArgumentRanges(self._s[3441]!, self._r[3441]!, [_1]) } - public var DialogList_Draft: String { return self._s[3441]! } - public var Wallet_Configuration_BlockchainIdInfo: String { return self._s[3442]! } + public var DialogList_Draft: String { return self._s[3442]! } + public var Wallet_Configuration_BlockchainIdInfo: String { return self._s[3443]! } public func PeopleNearby_VisibleUntil(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3443]!, self._r[3443]!, [_0]) + return formatWithArgumentRanges(self._s[3444]!, self._r[3444]!, [_0]) } - public var Privacy_TopPeersDelete: String { return self._s[3445]! } - public var LoginPassword_PasswordPlaceholder: String { return self._s[3446]! } - public var Passport_Identity_TypeIdentityCardUploadScan: String { return self._s[3447]! } - public var WebSearch_RecentSectionClear: String { return self._s[3448]! } - public var EditTheme_ErrorInvalidCharacters: String { return self._s[3449]! } - public var Watch_ChatList_NoConversationsTitle: String { return self._s[3451]! } - public var PeerInfo_ButtonMore: String { return self._s[3453]! } - public var Common_Done: String { return self._s[3454]! } - public var Shortcut_SwitchAccount: String { return self._s[3455]! } - public var AuthSessions_EmptyText: String { return self._s[3456]! } - public var Wallet_Configuration_BlockchainNameChangedTitle: String { return self._s[3457]! } - public var Conversation_ShareBotContactConfirmation: String { return self._s[3458]! } - public var Tour_Title5: String { return self._s[3459]! } - public var Wallet_Settings_Title: String { return self._s[3460]! } + public var Privacy_TopPeersDelete: String { return self._s[3446]! } + public var LoginPassword_PasswordPlaceholder: String { return self._s[3447]! } + public var Passport_Identity_TypeIdentityCardUploadScan: String { return self._s[3448]! } + public var WebSearch_RecentSectionClear: String { return self._s[3449]! } + public var EditTheme_ErrorInvalidCharacters: String { return self._s[3450]! } + public var Watch_ChatList_NoConversationsTitle: String { return self._s[3452]! } + public var PeerInfo_ButtonMore: String { return self._s[3454]! } + public var Common_Done: String { return self._s[3455]! } + public var Shortcut_SwitchAccount: String { return self._s[3456]! } + public var AuthSessions_EmptyText: String { return self._s[3457]! } + public var Wallet_Configuration_BlockchainNameChangedTitle: String { return self._s[3458]! } + public var Conversation_ShareBotContactConfirmation: String { return self._s[3459]! } + public var Tour_Title5: String { return self._s[3460]! } + public var Wallet_Settings_Title: String { return self._s[3461]! } public func Map_DirectionsDriveEta(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3461]!, self._r[3461]!, [_0]) + return formatWithArgumentRanges(self._s[3462]!, self._r[3462]!, [_0]) } - public var ApplyLanguage_UnsufficientDataTitle: String { return self._s[3462]! } - public var Conversation_LinkDialogSave: String { return self._s[3463]! } - public var GroupInfo_ActionRestrict: String { return self._s[3464]! } - public var Checkout_Title: String { return self._s[3465]! } - public var Channel_DiscussionGroup_HeaderLabel: String { return self._s[3467]! } - public var Channel_AdminLog_CanChangeInfo: String { return self._s[3469]! } - public var Notification_RenamedGroup: String { return self._s[3470]! } - public var PeopleNearby_Groups: String { return self._s[3471]! } - public var Checkout_PayWithFaceId: String { return self._s[3472]! } - public var Channel_BanList_BlockedTitle: String { return self._s[3473]! } - public var SettingsSearch_Synonyms_Notifications_InAppNotificationsSound: String { return self._s[3475]! } - public var Checkout_WebConfirmation_Title: String { return self._s[3476]! } - public var Notifications_MessageNotificationsAlert: String { return self._s[3477]! } + public var ApplyLanguage_UnsufficientDataTitle: String { return self._s[3463]! } + public var Conversation_LinkDialogSave: String { return self._s[3464]! } + public var GroupInfo_ActionRestrict: String { return self._s[3465]! } + public var Checkout_Title: String { return self._s[3466]! } + public var Channel_DiscussionGroup_HeaderLabel: String { return self._s[3468]! } + public var Channel_AdminLog_CanChangeInfo: String { return self._s[3470]! } + public var Notification_RenamedGroup: String { return self._s[3471]! } + public var PeopleNearby_Groups: String { return self._s[3472]! } + public var Checkout_PayWithFaceId: String { return self._s[3473]! } + public var Channel_BanList_BlockedTitle: String { return self._s[3474]! } + public var SettingsSearch_Synonyms_Notifications_InAppNotificationsSound: String { return self._s[3476]! } + public var Checkout_WebConfirmation_Title: String { return self._s[3477]! } + public var Notifications_MessageNotificationsAlert: String { return self._s[3478]! } public func Activity_RemindAboutGroup(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3478]!, self._r[3478]!, [_0]) + return formatWithArgumentRanges(self._s[3479]!, self._r[3479]!, [_0]) } - public var Profile_AddToExisting: String { return self._s[3480]! } + public var Profile_AddToExisting: String { return self._s[3481]! } public func Profile_CreateEncryptedChatOutdatedError(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3481]!, self._r[3481]!, [_0, _1]) + return formatWithArgumentRanges(self._s[3482]!, self._r[3482]!, [_0, _1]) } - public var Cache_Files: String { return self._s[3483]! } - public var Permissions_PrivacyPolicy: String { return self._s[3484]! } - public var SocksProxySetup_ConnectAndSave: String { return self._s[3485]! } - public var UserInfo_NotificationsDefaultDisabled: String { return self._s[3486]! } - public var AutoDownloadSettings_TypeContacts: String { return self._s[3488]! } - public var Appearance_ThemePreview_ChatList_1_Text: String { return self._s[3490]! } - public var Calls_NoCallsPlaceholder: String { return self._s[3491]! } + public var Cache_Files: String { return self._s[3484]! } + public var Permissions_PrivacyPolicy: String { return self._s[3485]! } + public var SocksProxySetup_ConnectAndSave: String { return self._s[3486]! } + public var UserInfo_NotificationsDefaultDisabled: String { return self._s[3487]! } + public var AutoDownloadSettings_TypeContacts: String { return self._s[3489]! } + public var Appearance_ThemePreview_ChatList_1_Text: String { return self._s[3491]! } + public var Calls_NoCallsPlaceholder: String { return self._s[3492]! } public func Wallet_Receive_ShareInvoiceUrlInfo(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3492]!, self._r[3492]!, [_0]) + return formatWithArgumentRanges(self._s[3493]!, self._r[3493]!, [_0]) } - public var Channel_Username_RevokeExistingUsernamesInfo: String { return self._s[3493]! } - public var VoiceOver_AttachMedia: String { return self._s[3496]! } - public var Notifications_ExceptionsGroupPlaceholder: String { return self._s[3497]! } + public var Channel_Username_RevokeExistingUsernamesInfo: String { return self._s[3494]! } + public var VoiceOver_AttachMedia: String { return self._s[3497]! } + public var Notifications_ExceptionsGroupPlaceholder: String { return self._s[3498]! } public func PUSH_CHAT_MESSAGE_INVOICE(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3498]!, self._r[3498]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[3499]!, self._r[3499]!, [_1, _2, _3]) } - public var SettingsSearch_Synonyms_Notifications_GroupNotificationsSound: String { return self._s[3499]! } - public var Conversation_SetReminder_Title: String { return self._s[3500]! } - public var Passport_FieldAddressHelp: String { return self._s[3501]! } - public var Privacy_GroupsAndChannels_InviteToChannelMultipleError: String { return self._s[3502]! } - public var PUSH_REMINDER_TITLE: String { return self._s[3503]! } + public var SettingsSearch_Synonyms_Notifications_GroupNotificationsSound: String { return self._s[3500]! } + public var Conversation_SetReminder_Title: String { return self._s[3501]! } + public var Passport_FieldAddressHelp: String { return self._s[3502]! } + public var Privacy_GroupsAndChannels_InviteToChannelMultipleError: String { return self._s[3503]! } + public var PUSH_REMINDER_TITLE: String { return self._s[3504]! } public func Login_TermsOfService_ProceedBot(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3504]!, self._r[3504]!, [_0]) + return formatWithArgumentRanges(self._s[3505]!, self._r[3505]!, [_0]) } - public var Channel_AdminLog_EmptyTitle: String { return self._s[3505]! } - public var Privacy_Calls_NeverAllow_Title: String { return self._s[3506]! } - public var Login_UnknownError: String { return self._s[3507]! } - public var Group_UpgradeNoticeText2: String { return self._s[3510]! } - public var Watch_Compose_AddContact: String { return self._s[3511]! } - public var ClearCache_StorageServiceFiles: String { return self._s[3512]! } - public var Web_Error: String { return self._s[3513]! } - public var Gif_Search: String { return self._s[3514]! } - public var Profile_MessageLifetime1h: String { return self._s[3515]! } - public var CheckoutInfo_ReceiverInfoEmailPlaceholder: String { return self._s[3516]! } - public var Channel_Username_CheckingUsername: String { return self._s[3517]! } - public var CallFeedback_ReasonSilentRemote: String { return self._s[3518]! } - public var AutoDownloadSettings_TypeChannels: String { return self._s[3519]! } - public var Channel_AboutItem: String { return self._s[3520]! } - public var Privacy_GroupsAndChannels_AlwaysAllow_Placeholder: String { return self._s[3522]! } - public var VoiceOver_Chat_VoiceMessage: String { return self._s[3523]! } - public var GroupInfo_SharedMedia: String { return self._s[3524]! } + public var Channel_AdminLog_EmptyTitle: String { return self._s[3506]! } + public var Privacy_Calls_NeverAllow_Title: String { return self._s[3507]! } + public var Login_UnknownError: String { return self._s[3508]! } + public var Group_UpgradeNoticeText2: String { return self._s[3511]! } + public var Watch_Compose_AddContact: String { return self._s[3512]! } + public var ClearCache_StorageServiceFiles: String { return self._s[3513]! } + public var Web_Error: String { return self._s[3514]! } + public var Gif_Search: String { return self._s[3515]! } + public var Profile_MessageLifetime1h: String { return self._s[3516]! } + public var CheckoutInfo_ReceiverInfoEmailPlaceholder: String { return self._s[3517]! } + public var Channel_Username_CheckingUsername: String { return self._s[3518]! } + public var CallFeedback_ReasonSilentRemote: String { return self._s[3519]! } + public var AutoDownloadSettings_TypeChannels: String { return self._s[3520]! } + public var Channel_AboutItem: String { return self._s[3521]! } + public var Privacy_GroupsAndChannels_AlwaysAllow_Placeholder: String { return self._s[3523]! } + public var VoiceOver_Chat_VoiceMessage: String { return self._s[3524]! } + public var GroupInfo_SharedMedia: String { return self._s[3525]! } public func Channel_AdminLog_MessagePromotedName(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3525]!, self._r[3525]!, [_1]) + return formatWithArgumentRanges(self._s[3526]!, self._r[3526]!, [_1]) } - public var Call_PhoneCallInProgressMessage: String { return self._s[3526]! } + public var Call_PhoneCallInProgressMessage: String { return self._s[3527]! } public func PUSH_CHANNEL_ALBUM(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3527]!, self._r[3527]!, [_1]) + return formatWithArgumentRanges(self._s[3528]!, self._r[3528]!, [_1]) } - public var ChatList_UndoArchiveRevealedText: String { return self._s[3528]! } - public var GroupInfo_InviteLink_RevokeAlert_Text: String { return self._s[3529]! } - public var Conversation_SearchByName_Placeholder: String { return self._s[3530]! } - public var CreatePoll_AddOption: String { return self._s[3531]! } - public var GroupInfo_Permissions_SearchPlaceholder: String { return self._s[3532]! } - public var Group_UpgradeNoticeHeader: String { return self._s[3533]! } - public var Channel_Management_AddModerator: String { return self._s[3534]! } - public var AutoDownloadSettings_MaxFileSize: String { return self._s[3535]! } - public var StickerPacksSettings_ShowStickersButton: String { return self._s[3536]! } - public var Wallet_Info_RefreshErrorNetworkText: String { return self._s[3537]! } - public var Theme_Colors_Background: String { return self._s[3538]! } - public var NotificationsSound_Hello: String { return self._s[3541]! } - public var SocksProxySetup_SavedProxies: String { return self._s[3543]! } - public var Channel_Stickers_Placeholder: String { return self._s[3545]! } + public var ChatList_UndoArchiveRevealedText: String { return self._s[3529]! } + public var GroupInfo_InviteLink_RevokeAlert_Text: String { return self._s[3530]! } + public var Conversation_SearchByName_Placeholder: String { return self._s[3531]! } + public var CreatePoll_AddOption: String { return self._s[3532]! } + public var GroupInfo_Permissions_SearchPlaceholder: String { return self._s[3533]! } + public var Group_UpgradeNoticeHeader: String { return self._s[3534]! } + public var Channel_Management_AddModerator: String { return self._s[3535]! } + public var AutoDownloadSettings_MaxFileSize: String { return self._s[3536]! } + public var StickerPacksSettings_ShowStickersButton: String { return self._s[3537]! } + public var Wallet_Info_RefreshErrorNetworkText: String { return self._s[3538]! } + public var Theme_Colors_Background: String { return self._s[3539]! } + public var NotificationsSound_Hello: String { return self._s[3542]! } + public var SocksProxySetup_SavedProxies: String { return self._s[3544]! } + public var Channel_Stickers_Placeholder: String { return self._s[3546]! } public func Login_EmailCodeBody(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3546]!, self._r[3546]!, [_0]) + return formatWithArgumentRanges(self._s[3547]!, self._r[3547]!, [_0]) } - public var PrivacyPolicy_DeclineDeclineAndDelete: String { return self._s[3547]! } - public var Channel_Management_AddModeratorHelp: String { return self._s[3548]! } - public var ContactInfo_BirthdayLabel: String { return self._s[3549]! } - public var ChangePhoneNumberCode_RequestingACall: String { return self._s[3550]! } - public var AutoDownloadSettings_Channels: String { return self._s[3551]! } - public var Passport_Language_mn: String { return self._s[3552]! } - public var Settings_ChatFolders: String { return self._s[3553]! } - public var Notifications_ResetAllNotificationsHelp: String { return self._s[3556]! } - public var GroupInfo_Permissions_SlowmodeValue_Off: String { return self._s[3557]! } - public var Passport_Language_ja: String { return self._s[3559]! } - public var Settings_About_Title: String { return self._s[3560]! } - public var Settings_NotificationsAndSounds: String { return self._s[3561]! } - public var ChannelInfo_DeleteGroup: String { return self._s[3562]! } - public var Settings_BlockedUsers: String { return self._s[3563]! } + public var PrivacyPolicy_DeclineDeclineAndDelete: String { return self._s[3548]! } + public var Channel_Management_AddModeratorHelp: String { return self._s[3549]! } + public var ContactInfo_BirthdayLabel: String { return self._s[3550]! } + public var ChangePhoneNumberCode_RequestingACall: String { return self._s[3551]! } + public var AutoDownloadSettings_Channels: String { return self._s[3552]! } + public var Passport_Language_mn: String { return self._s[3553]! } + public var Settings_ChatFolders: String { return self._s[3554]! } + public var Notifications_ResetAllNotificationsHelp: String { return self._s[3557]! } + public var GroupInfo_Permissions_SlowmodeValue_Off: String { return self._s[3558]! } + public var Passport_Language_ja: String { return self._s[3560]! } + public var Settings_About_Title: String { return self._s[3561]! } + public var Settings_NotificationsAndSounds: String { return self._s[3562]! } + public var ChannelInfo_DeleteGroup: String { return self._s[3563]! } + public var Settings_BlockedUsers: String { return self._s[3564]! } public func Time_MonthOfYear_m4(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3564]!, self._r[3564]!, [_0]) + return formatWithArgumentRanges(self._s[3565]!, self._r[3565]!, [_0]) } - public var EditTheme_Create_Preview_OutgoingText: String { return self._s[3565]! } - public var Wallet_Weekday_Today: String { return self._s[3566]! } - public var ChatListFolderSettings_AddRecommended: String { return self._s[3567]! } - public var AutoDownloadSettings_PreloadVideo: String { return self._s[3568]! } - public var Widget_ApplicationLocked: String { return self._s[3569]! } - public var Passport_Address_AddResidentialAddress: String { return self._s[3570]! } - public var Channel_Username_Title: String { return self._s[3571]! } + public var EditTheme_Create_Preview_OutgoingText: String { return self._s[3566]! } + public var Wallet_Weekday_Today: String { return self._s[3567]! } + public var ChatListFolderSettings_AddRecommended: String { return self._s[3568]! } + public var AutoDownloadSettings_PreloadVideo: String { return self._s[3569]! } + public var Widget_ApplicationLocked: String { return self._s[3570]! } + public var Passport_Address_AddResidentialAddress: String { return self._s[3571]! } + public var Channel_Username_Title: String { return self._s[3572]! } public func Notification_RemovedGroupPhoto(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3572]!, self._r[3572]!, [_0]) + return formatWithArgumentRanges(self._s[3573]!, self._r[3573]!, [_0]) } - public var AttachmentMenu_File: String { return self._s[3574]! } - public var AppleWatch_Title: String { return self._s[3575]! } - public var Activity_RecordingVideoMessage: String { return self._s[3576]! } + public var AttachmentMenu_File: String { return self._s[3575]! } + public var AppleWatch_Title: String { return self._s[3576]! } + public var Activity_RecordingVideoMessage: String { return self._s[3577]! } public func Channel_DiscussionGroup_PublicChannelLink(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3577]!, self._r[3577]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3578]!, self._r[3578]!, [_1, _2]) } - public var Theme_Colors_Messages: String { return self._s[3578]! } - public var Weekday_Saturday: String { return self._s[3579]! } - public var WallpaperPreview_SwipeColorsTopText: String { return self._s[3580]! } - public var Profile_CreateEncryptedChatError: String { return self._s[3581]! } - public var Common_Next: String { return self._s[3583]! } - public var Channel_Stickers_YourStickers: String { return self._s[3585]! } - public var Message_Theme: String { return self._s[3586]! } - public var Call_AudioRouteHeadphones: String { return self._s[3587]! } - public var TwoStepAuth_EnterPasswordForgot: String { return self._s[3589]! } - public var Watch_Contacts_NoResults: String { return self._s[3591]! } - public var PhotoEditor_TintTool: String { return self._s[3594]! } - public var LoginPassword_ResetAccount: String { return self._s[3596]! } - public var Settings_SavedMessages: String { return self._s[3597]! } - public var SettingsSearch_Synonyms_Appearance_Animations: String { return self._s[3598]! } - public var Bot_GenericSupportStatus: String { return self._s[3599]! } - public var StickerPack_Add: String { return self._s[3600]! } - public var Checkout_TotalAmount: String { return self._s[3601]! } - public var Your_cards_number_is_invalid: String { return self._s[3602]! } - public var SettingsSearch_Synonyms_Appearance_AutoNightTheme: String { return self._s[3603]! } - public var VoiceOver_Chat_VideoMessage: String { return self._s[3604]! } + public var Theme_Colors_Messages: String { return self._s[3579]! } + public var Weekday_Saturday: String { return self._s[3580]! } + public var WallpaperPreview_SwipeColorsTopText: String { return self._s[3581]! } + public var Profile_CreateEncryptedChatError: String { return self._s[3582]! } + public var Common_Next: String { return self._s[3584]! } + public var Channel_Stickers_YourStickers: String { return self._s[3586]! } + public var Message_Theme: String { return self._s[3587]! } + public var Call_AudioRouteHeadphones: String { return self._s[3588]! } + public var TwoStepAuth_EnterPasswordForgot: String { return self._s[3590]! } + public var Watch_Contacts_NoResults: String { return self._s[3592]! } + public var PhotoEditor_TintTool: String { return self._s[3595]! } + public var LoginPassword_ResetAccount: String { return self._s[3597]! } + public var Settings_SavedMessages: String { return self._s[3598]! } + public var SettingsSearch_Synonyms_Appearance_Animations: String { return self._s[3599]! } + public var Bot_GenericSupportStatus: String { return self._s[3600]! } + public var StickerPack_Add: String { return self._s[3601]! } + public var Checkout_TotalAmount: String { return self._s[3602]! } + public var Your_cards_number_is_invalid: String { return self._s[3603]! } + public var SettingsSearch_Synonyms_Appearance_AutoNightTheme: String { return self._s[3604]! } + public var VoiceOver_Chat_VideoMessage: String { return self._s[3605]! } public func ChangePhoneNumberCode_CallTimer(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3605]!, self._r[3605]!, [_0]) + return formatWithArgumentRanges(self._s[3606]!, self._r[3606]!, [_0]) } public func GroupPermission_AddedInfo(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3606]!, self._r[3606]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3607]!, self._r[3607]!, [_1, _2]) } - public var ChatSettings_ConnectionType_UseSocks5: String { return self._s[3607]! } + public var ChatSettings_ConnectionType_UseSocks5: String { return self._s[3608]! } public func PUSH_CHAT_PHOTO_EDITED(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3609]!, self._r[3609]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3610]!, self._r[3610]!, [_1, _2]) } public func Conversation_RestrictedTextTimed(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3610]!, self._r[3610]!, [_0]) + return formatWithArgumentRanges(self._s[3611]!, self._r[3611]!, [_0]) } - public var GroupInfo_InviteLink_ShareLink: String { return self._s[3611]! } - public var StickerPack_Share: String { return self._s[3612]! } - public var Passport_DeleteAddress: String { return self._s[3613]! } - public var Settings_Passport: String { return self._s[3614]! } - public var SharedMedia_EmptyFilesText: String { return self._s[3615]! } - public var Conversation_DeleteMessagesForMe: String { return self._s[3616]! } - public var PasscodeSettings_AutoLock_IfAwayFor_1hour: String { return self._s[3617]! } - public var Contacts_PermissionsText: String { return self._s[3618]! } - public var Group_Setup_HistoryVisible: String { return self._s[3619]! } - public var Wallet_Month_ShortDecember: String { return self._s[3621]! } - public var Channel_EditAdmin_PermissionEnabledByDefault: String { return self._s[3622]! } - public var Passport_Address_AddRentalAgreement: String { return self._s[3623]! } - public var SocksProxySetup_Title: String { return self._s[3624]! } - public var Notification_Mute1h: String { return self._s[3625]! } + public var GroupInfo_InviteLink_ShareLink: String { return self._s[3612]! } + public var StickerPack_Share: String { return self._s[3613]! } + public var Passport_DeleteAddress: String { return self._s[3614]! } + public var Settings_Passport: String { return self._s[3615]! } + public var SharedMedia_EmptyFilesText: String { return self._s[3616]! } + public var Conversation_DeleteMessagesForMe: String { return self._s[3617]! } + public var PasscodeSettings_AutoLock_IfAwayFor_1hour: String { return self._s[3618]! } + public var Contacts_PermissionsText: String { return self._s[3619]! } + public var Group_Setup_HistoryVisible: String { return self._s[3620]! } + public var Wallet_Month_ShortDecember: String { return self._s[3622]! } + public var Channel_EditAdmin_PermissionEnabledByDefault: String { return self._s[3623]! } + public var Passport_Address_AddRentalAgreement: String { return self._s[3624]! } + public var SocksProxySetup_Title: String { return self._s[3625]! } + public var Notification_Mute1h: String { return self._s[3626]! } public func Passport_Email_CodeHelp(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3626]!, self._r[3626]!, [_0]) + return formatWithArgumentRanges(self._s[3627]!, self._r[3627]!, [_0]) } - public var NotificationSettings_ShowNotificationsAllAccountsInfoOff: String { return self._s[3627]! } + public var NotificationSettings_ShowNotificationsAllAccountsInfoOff: String { return self._s[3628]! } public func PUSH_PINNED_GEOLIVE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3628]!, self._r[3628]!, [_1]) + return formatWithArgumentRanges(self._s[3629]!, self._r[3629]!, [_1]) } - public var FastTwoStepSetup_PasswordSection: String { return self._s[3629]! } - public var NetworkUsageSettings_ResetStatsConfirmation: String { return self._s[3632]! } - public var InfoPlist_NSFaceIDUsageDescription: String { return self._s[3634]! } - public var DialogList_NoMessagesText: String { return self._s[3635]! } - public var Privacy_ContactsResetConfirmation: String { return self._s[3636]! } - public var Privacy_Calls_P2PHelp: String { return self._s[3637]! } - public var Channel_DiscussionGroup_SearchPlaceholder: String { return self._s[3639]! } - public var Your_cards_expiration_year_is_invalid: String { return self._s[3640]! } - public var Common_TakePhotoOrVideo: String { return self._s[3641]! } - public var Wallet_Words_Text: String { return self._s[3642]! } - public var Call_StatusBusy: String { return self._s[3643]! } - public var Conversation_PinnedMessage: String { return self._s[3644]! } - public var AutoDownloadSettings_VoiceMessagesTitle: String { return self._s[3645]! } - public var ChatList_EmptyChatListNewMessage: String { return self._s[3646]! } - public var Wallet_Configuration_BlockchainNameChangedProceed: String { return self._s[3647]! } - public var TwoStepAuth_SetupPasswordConfirmFailed: String { return self._s[3648]! } - public var Undo_ChatCleared: String { return self._s[3649]! } - public var CreatePoll_Explanation: String { return self._s[3650]! } - public var AppleWatch_ReplyPresets: String { return self._s[3651]! } - public var Passport_DiscardMessageDescription: String { return self._s[3653]! } - public var Login_NetworkError: String { return self._s[3654]! } + public var FastTwoStepSetup_PasswordSection: String { return self._s[3630]! } + public var NetworkUsageSettings_ResetStatsConfirmation: String { return self._s[3633]! } + public var InfoPlist_NSFaceIDUsageDescription: String { return self._s[3635]! } + public var DialogList_NoMessagesText: String { return self._s[3636]! } + public var Privacy_ContactsResetConfirmation: String { return self._s[3637]! } + public var Privacy_Calls_P2PHelp: String { return self._s[3638]! } + public var Channel_DiscussionGroup_SearchPlaceholder: String { return self._s[3640]! } + public var Your_cards_expiration_year_is_invalid: String { return self._s[3641]! } + public var Common_TakePhotoOrVideo: String { return self._s[3642]! } + public var Wallet_Words_Text: String { return self._s[3643]! } + public var Call_StatusBusy: String { return self._s[3644]! } + public var Conversation_PinnedMessage: String { return self._s[3645]! } + public var AutoDownloadSettings_VoiceMessagesTitle: String { return self._s[3646]! } + public var ChatList_EmptyChatListNewMessage: String { return self._s[3647]! } + public var Wallet_Configuration_BlockchainNameChangedProceed: String { return self._s[3648]! } + public var TwoStepAuth_SetupPasswordConfirmFailed: String { return self._s[3649]! } + public var Undo_ChatCleared: String { return self._s[3650]! } + public var CreatePoll_Explanation: String { return self._s[3651]! } + public var AppleWatch_ReplyPresets: String { return self._s[3652]! } + public var Passport_DiscardMessageDescription: String { return self._s[3654]! } + public var Login_NetworkError: String { return self._s[3655]! } public func Notification_PinnedRoundMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3655]!, self._r[3655]!, [_0]) - } - public func Channel_AdminLog_MessageRemovedChannelUsername(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[3656]!, self._r[3656]!, [_0]) } - public var SocksProxySetup_PasswordPlaceholder: String { return self._s[3657]! } - public var Wallet_WordCheck_ViewWords: String { return self._s[3659]! } - public var Login_ResetAccountProtected_LimitExceeded: String { return self._s[3660]! } + public func Channel_AdminLog_MessageRemovedChannelUsername(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3657]!, self._r[3657]!, [_0]) + } + public var SocksProxySetup_PasswordPlaceholder: String { return self._s[3658]! } + public var Wallet_WordCheck_ViewWords: String { return self._s[3660]! } + public var Login_ResetAccountProtected_LimitExceeded: String { return self._s[3661]! } public func Watch_LastSeen_YesterdayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3662]!, self._r[3662]!, [_0]) + return formatWithArgumentRanges(self._s[3663]!, self._r[3663]!, [_0]) } - public var Call_ConnectionErrorMessage: String { return self._s[3663]! } - public var VoiceOver_Chat_Music: String { return self._s[3664]! } - public var ChatListFolder_CategoryContacts: String { return self._s[3665]! } - public var SettingsSearch_Synonyms_Notifications_MessageNotificationsSound: String { return self._s[3666]! } - public var Compose_GroupTokenListPlaceholder: String { return self._s[3668]! } - public var ConversationMedia_Title: String { return self._s[3669]! } - public var EncryptionKey_Title: String { return self._s[3671]! } - public var TwoStepAuth_EnterPasswordTitle: String { return self._s[3672]! } - public var Notification_Exceptions_AddException: String { return self._s[3673]! } - public var PrivacySettings_BlockedPeersEmpty: String { return self._s[3674]! } - public var Profile_MessageLifetime1m: String { return self._s[3675]! } + public var Call_ConnectionErrorMessage: String { return self._s[3664]! } + public var VoiceOver_Chat_Music: String { return self._s[3665]! } + public var ChatListFolder_CategoryContacts: String { return self._s[3666]! } + public var SettingsSearch_Synonyms_Notifications_MessageNotificationsSound: String { return self._s[3667]! } + public var Compose_GroupTokenListPlaceholder: String { return self._s[3669]! } + public var ConversationMedia_Title: String { return self._s[3670]! } + public var EncryptionKey_Title: String { return self._s[3672]! } + public var TwoStepAuth_EnterPasswordTitle: String { return self._s[3673]! } + public var Notification_Exceptions_AddException: String { return self._s[3674]! } + public var PrivacySettings_BlockedPeersEmpty: String { return self._s[3675]! } + public var Profile_MessageLifetime1m: String { return self._s[3676]! } public func Channel_AdminLog_MessageUnkickedName(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3676]!, self._r[3676]!, [_1]) + return formatWithArgumentRanges(self._s[3677]!, self._r[3677]!, [_1]) } - public var Month_GenMay: String { return self._s[3677]! } + public var Month_GenMay: String { return self._s[3678]! } public func LiveLocationUpdated_TodayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3678]!, self._r[3678]!, [_0]) + return formatWithArgumentRanges(self._s[3679]!, self._r[3679]!, [_0]) } - public var PeopleNearby_Users: String { return self._s[3679]! } - public var Wallet_Send_AddressInfo: String { return self._s[3680]! } - public var ChannelMembers_WhoCanAddMembersAllHelp: String { return self._s[3681]! } - public var AutoDownloadSettings_ResetSettings: String { return self._s[3682]! } + public var PeopleNearby_Users: String { return self._s[3680]! } + public var Wallet_Send_AddressInfo: String { return self._s[3681]! } + public var ChannelMembers_WhoCanAddMembersAllHelp: String { return self._s[3682]! } + public var AutoDownloadSettings_ResetSettings: String { return self._s[3683]! } public func Wallet_Updated_AtDate(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3684]!, self._r[3684]!, [_0]) + return formatWithArgumentRanges(self._s[3685]!, self._r[3685]!, [_0]) } - public var Stats_LoadingTitle: String { return self._s[3685]! } - public var Conversation_EmptyPlaceholder: String { return self._s[3686]! } - public var Passport_Address_AddPassportRegistration: String { return self._s[3687]! } - public var Notifications_ChannelNotificationsAlert: String { return self._s[3688]! } - public var ChatSettings_AutoDownloadUsingCellular: String { return self._s[3689]! } - public var Camera_TapAndHoldForVideo: String { return self._s[3690]! } - public var Channel_JoinChannel: String { return self._s[3692]! } - public var Appearance_Animations: String { return self._s[3695]! } + public var Stats_LoadingTitle: String { return self._s[3686]! } + public var Conversation_EmptyPlaceholder: String { return self._s[3687]! } + public var Passport_Address_AddPassportRegistration: String { return self._s[3688]! } + public var Notifications_ChannelNotificationsAlert: String { return self._s[3689]! } + public var ChatSettings_AutoDownloadUsingCellular: String { return self._s[3690]! } + public var Camera_TapAndHoldForVideo: String { return self._s[3691]! } + public var Channel_JoinChannel: String { return self._s[3693]! } + public var Appearance_Animations: String { return self._s[3696]! } public func Notification_MessageLifetimeChanged(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3696]!, self._r[3696]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3697]!, self._r[3697]!, [_1, _2]) } - public var Stickers_GroupStickers: String { return self._s[3698]! } - public var Appearance_ShareTheme: String { return self._s[3699]! } - public var TwoFactorSetup_Hint_Placeholder: String { return self._s[3700]! } - public var ConvertToSupergroup_HelpTitle: String { return self._s[3702]! } - public var StickerPackActionInfo_RemovedTitle: String { return self._s[3703]! } - public var Passport_Address_Street: String { return self._s[3704]! } - public var Conversation_AddContact: String { return self._s[3705]! } - public var Login_PhonePlaceholder: String { return self._s[3706]! } - public var Channel_Members_InviteLink: String { return self._s[3708]! } - public var Bot_Stop: String { return self._s[3709]! } - public var SettingsSearch_Synonyms_Proxy_UseForCalls: String { return self._s[3711]! } - public var Notification_PassportValueAddress: String { return self._s[3712]! } - public var Month_ShortJuly: String { return self._s[3713]! } - public var Passport_Address_TypeTemporaryRegistrationUploadScan: String { return self._s[3714]! } - public var Channel_AdminLog_BanSendMedia: String { return self._s[3715]! } - public var Passport_Identity_ReverseSide: String { return self._s[3716]! } - public var Watch_Stickers_Recents: String { return self._s[3719]! } - public var PrivacyLastSeenSettings_EmpryUsersPlaceholder: String { return self._s[3721]! } - public var Map_SendThisLocation: String { return self._s[3722]! } + public var Stickers_GroupStickers: String { return self._s[3699]! } + public var Appearance_ShareTheme: String { return self._s[3700]! } + public var TwoFactorSetup_Hint_Placeholder: String { return self._s[3701]! } + public var ConvertToSupergroup_HelpTitle: String { return self._s[3703]! } + public var StickerPackActionInfo_RemovedTitle: String { return self._s[3704]! } + public var Passport_Address_Street: String { return self._s[3705]! } + public var Conversation_AddContact: String { return self._s[3706]! } + public var Login_PhonePlaceholder: String { return self._s[3707]! } + public var Channel_Members_InviteLink: String { return self._s[3709]! } + public var Bot_Stop: String { return self._s[3710]! } + public var SettingsSearch_Synonyms_Proxy_UseForCalls: String { return self._s[3712]! } + public var Notification_PassportValueAddress: String { return self._s[3713]! } + public var Month_ShortJuly: String { return self._s[3714]! } + public var Passport_Address_TypeTemporaryRegistrationUploadScan: String { return self._s[3715]! } + public var Channel_AdminLog_BanSendMedia: String { return self._s[3716]! } + public var Passport_Identity_ReverseSide: String { return self._s[3717]! } + public var Watch_Stickers_Recents: String { return self._s[3720]! } + public var PrivacyLastSeenSettings_EmpryUsersPlaceholder: String { return self._s[3722]! } + public var Map_SendThisLocation: String { return self._s[3723]! } public func Time_MonthOfYear_m1(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3723]!, self._r[3723]!, [_0]) - } - public func InviteText_SingleContact(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[3724]!, self._r[3724]!, [_0]) } - public var ConvertToSupergroup_Note: String { return self._s[3725]! } - public var Wallet_Intro_NotNow: String { return self._s[3726]! } + public func InviteText_SingleContact(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3725]!, self._r[3725]!, [_0]) + } + public var ConvertToSupergroup_Note: String { return self._s[3726]! } + public var Wallet_Intro_NotNow: String { return self._s[3727]! } public func FileSize_MB(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3727]!, self._r[3727]!, [_0]) + return formatWithArgumentRanges(self._s[3728]!, self._r[3728]!, [_0]) } - public var NetworkUsageSettings_GeneralDataSection: String { return self._s[3728]! } + public var NetworkUsageSettings_GeneralDataSection: String { return self._s[3729]! } public func Compatibility_SecretMediaVersionTooLow(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3729]!, self._r[3729]!, [_0, _1]) + return formatWithArgumentRanges(self._s[3730]!, self._r[3730]!, [_0, _1]) } - public var Login_CallRequestState3: String { return self._s[3731]! } - public var Wallpaper_SearchShort: String { return self._s[3732]! } - public var SettingsSearch_Synonyms_Appearance_ColorTheme: String { return self._s[3734]! } - public var PasscodeSettings_UnlockWithFaceId: String { return self._s[3735]! } - public var Channel_BotDoesntSupportGroups: String { return self._s[3736]! } + public var Login_CallRequestState3: String { return self._s[3732]! } + public var Wallpaper_SearchShort: String { return self._s[3733]! } + public var SettingsSearch_Synonyms_Appearance_ColorTheme: String { return self._s[3735]! } + public var PasscodeSettings_UnlockWithFaceId: String { return self._s[3736]! } + public var Channel_BotDoesntSupportGroups: String { return self._s[3737]! } public func PUSH_CHAT_MESSAGE_GEOLIVE(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3737]!, self._r[3737]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3738]!, self._r[3738]!, [_1, _2]) } - public var Channel_AdminLogFilter_Title: String { return self._s[3738]! } - public var Appearance_ThemePreview_Chat_4_Text: String { return self._s[3740]! } - public var Notifications_GroupNotificationsExceptions: String { return self._s[3743]! } + public var Channel_AdminLogFilter_Title: String { return self._s[3739]! } + public var Appearance_ThemePreview_Chat_4_Text: String { return self._s[3741]! } + public var Notifications_GroupNotificationsExceptions: String { return self._s[3744]! } public func FileSize_B(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3744]!, self._r[3744]!, [_0]) + return formatWithArgumentRanges(self._s[3745]!, self._r[3745]!, [_0]) } - public var Passport_CorrectErrors: String { return self._s[3745]! } - public var VoiceOver_Chat_YourAnonymousPoll: String { return self._s[3746]! } + public var Passport_CorrectErrors: String { return self._s[3746]! } + public var VoiceOver_Chat_YourAnonymousPoll: String { return self._s[3747]! } public func Channel_MessageTitleUpdated(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3747]!, self._r[3747]!, [_0]) + return formatWithArgumentRanges(self._s[3748]!, self._r[3748]!, [_0]) } - public var Map_SendMyCurrentLocation: String { return self._s[3748]! } - public var Channel_DiscussionGroup: String { return self._s[3749]! } - public var TwoFactorSetup_Email_SkipConfirmationSkip: String { return self._s[3750]! } + public var Map_SendMyCurrentLocation: String { return self._s[3749]! } + public var Channel_DiscussionGroup: String { return self._s[3750]! } + public var TwoFactorSetup_Email_SkipConfirmationSkip: String { return self._s[3751]! } public func PUSH_PINNED_CONTACT(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3751]!, self._r[3751]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3752]!, self._r[3752]!, [_1, _2]) } - public var SharedMedia_SearchNoResults: String { return self._s[3752]! } - public var Permissions_NotificationsText_v0: String { return self._s[3753]! } - public var Channel_EditAdmin_PermissionDeleteMessagesOfOthers: String { return self._s[3754]! } - public var Appearance_AppIcon: String { return self._s[3755]! } - public var Appearance_ThemePreview_ChatList_3_AuthorName: String { return self._s[3756]! } - public var LoginPassword_FloodError: String { return self._s[3757]! } - public var Wallet_Send_OwnAddressAlertProceed: String { return self._s[3759]! } - public var Group_Setup_HistoryHiddenHelp: String { return self._s[3760]! } + public var SharedMedia_SearchNoResults: String { return self._s[3753]! } + public var Permissions_NotificationsText_v0: String { return self._s[3754]! } + public var Channel_EditAdmin_PermissionDeleteMessagesOfOthers: String { return self._s[3755]! } + public var Appearance_AppIcon: String { return self._s[3756]! } + public var Appearance_ThemePreview_ChatList_3_AuthorName: String { return self._s[3757]! } + public var LoginPassword_FloodError: String { return self._s[3758]! } + public var Wallet_Send_OwnAddressAlertProceed: String { return self._s[3760]! } + public var Group_Setup_HistoryHiddenHelp: String { return self._s[3761]! } public func TwoStepAuth_PendingEmailHelp(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3761]!, self._r[3761]!, [_0]) + return formatWithArgumentRanges(self._s[3762]!, self._r[3762]!, [_0]) } - public var Passport_Language_bn: String { return self._s[3762]! } + public var Passport_Language_bn: String { return self._s[3763]! } public func DialogList_SingleUploadingPhotoSuffix(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3763]!, self._r[3763]!, [_0]) + return formatWithArgumentRanges(self._s[3764]!, self._r[3764]!, [_0]) } - public var ChatList_Context_Pin: String { return self._s[3764]! } + public var ChatList_Context_Pin: String { return self._s[3765]! } public func Notification_PinnedAudioMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3765]!, self._r[3765]!, [_0]) - } - public func Channel_AdminLog_MessageChangedGroupStickerPack(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[3766]!, self._r[3766]!, [_0]) } - public var Wallet_Navigation_Close: String { return self._s[3767]! } - public var GroupInfo_InvitationLinkGroupFull: String { return self._s[3771]! } - public var Group_EditAdmin_PermissionChangeInfo: String { return self._s[3773]! } - public var Wallet_Month_GenDecember: String { return self._s[3774]! } - public var Contacts_PermissionsAllow: String { return self._s[3775]! } - public var ReportPeer_ReasonCopyright: String { return self._s[3776]! } - public var Channel_EditAdmin_PermissinAddAdminOn: String { return self._s[3777]! } - public var WallpaperPreview_Pattern: String { return self._s[3778]! } - public var Paint_Duplicate: String { return self._s[3779]! } - public var Passport_Address_Country: String { return self._s[3780]! } - public var Notification_RenamedChannel: String { return self._s[3782]! } - public var DialogList_UnknownPinLimitError: String { return self._s[3783]! } - public var CheckoutInfo_ErrorPostcodeInvalid: String { return self._s[3784]! } - public var ChatList_Context_Unmute: String { return self._s[3785]! } - public var Group_MessagePhotoUpdated: String { return self._s[3786]! } - public var Channel_BanUser_PermissionSendMedia: String { return self._s[3787]! } - public var Conversation_ContextMenuBan: String { return self._s[3788]! } - public var TwoStepAuth_EmailSent: String { return self._s[3789]! } - public var MessagePoll_NoVotes: String { return self._s[3790]! } - public var Wallet_Send_ErrorNotEnoughFundsTitle: String { return self._s[3791]! } - public var Passport_Language_is: String { return self._s[3793]! } - public var PeopleNearby_UsersEmpty: String { return self._s[3795]! } - public var Tour_Text5: String { return self._s[3796]! } + public func Channel_AdminLog_MessageChangedGroupStickerPack(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3767]!, self._r[3767]!, [_0]) + } + public var Wallet_Navigation_Close: String { return self._s[3768]! } + public var GroupInfo_InvitationLinkGroupFull: String { return self._s[3772]! } + public var Group_EditAdmin_PermissionChangeInfo: String { return self._s[3774]! } + public var Wallet_Month_GenDecember: String { return self._s[3775]! } + public var Contacts_PermissionsAllow: String { return self._s[3776]! } + public var ReportPeer_ReasonCopyright: String { return self._s[3777]! } + public var Channel_EditAdmin_PermissinAddAdminOn: String { return self._s[3778]! } + public var WallpaperPreview_Pattern: String { return self._s[3779]! } + public var Paint_Duplicate: String { return self._s[3780]! } + public var Passport_Address_Country: String { return self._s[3781]! } + public var Notification_RenamedChannel: String { return self._s[3783]! } + public var DialogList_UnknownPinLimitError: String { return self._s[3784]! } + public var CheckoutInfo_ErrorPostcodeInvalid: String { return self._s[3785]! } + public var ChatList_Context_Unmute: String { return self._s[3786]! } + public var Group_MessagePhotoUpdated: String { return self._s[3787]! } + public var Channel_BanUser_PermissionSendMedia: String { return self._s[3788]! } + public var Conversation_ContextMenuBan: String { return self._s[3789]! } + public var TwoStepAuth_EmailSent: String { return self._s[3790]! } + public var MessagePoll_NoVotes: String { return self._s[3791]! } + public var Wallet_Send_ErrorNotEnoughFundsTitle: String { return self._s[3792]! } + public var Passport_Language_is: String { return self._s[3794]! } + public var PeopleNearby_UsersEmpty: String { return self._s[3796]! } + public var Tour_Text5: String { return self._s[3797]! } public func Call_GroupFormat(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3799]!, self._r[3799]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3800]!, self._r[3800]!, [_1, _2]) } - public var Undo_SecretChatDeleted: String { return self._s[3800]! } - public var SocksProxySetup_ShareQRCode: String { return self._s[3801]! } + public var Undo_SecretChatDeleted: String { return self._s[3801]! } + public var SocksProxySetup_ShareQRCode: String { return self._s[3802]! } public func VoiceOver_Chat_Size(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3802]!, self._r[3802]!, [_0]) + return formatWithArgumentRanges(self._s[3803]!, self._r[3803]!, [_0]) } - public var Forward_ErrorDisabledForChat: String { return self._s[3803]! } - public var LogoutOptions_ChangePhoneNumberText: String { return self._s[3804]! } - public var Paint_Edit: String { return self._s[3806]! } - public var ScheduledMessages_ReminderNotification: String { return self._s[3808]! } - public var Undo_DeletedGroup: String { return self._s[3810]! } - public var LoginPassword_ForgotPassword: String { return self._s[3811]! } - public var Wallet_WordImport_IncorrectTitle: String { return self._s[3812]! } - public var GroupInfo_GroupNamePlaceholder: String { return self._s[3813]! } + public var Forward_ErrorDisabledForChat: String { return self._s[3804]! } + public var LogoutOptions_ChangePhoneNumberText: String { return self._s[3805]! } + public var Paint_Edit: String { return self._s[3807]! } + public var ScheduledMessages_ReminderNotification: String { return self._s[3809]! } + public var Undo_DeletedGroup: String { return self._s[3811]! } + public var LoginPassword_ForgotPassword: String { return self._s[3812]! } + public var Wallet_WordImport_IncorrectTitle: String { return self._s[3813]! } + public var GroupInfo_GroupNamePlaceholder: String { return self._s[3814]! } public func Notification_Kicked(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3814]!, self._r[3814]!, [_0, _1]) + return formatWithArgumentRanges(self._s[3815]!, self._r[3815]!, [_0, _1]) } - public var AppWallet_TransactionInfo_FeeInfoURL: String { return self._s[3815]! } - public var Conversation_InputTextCaptionPlaceholder: String { return self._s[3816]! } - public var AutoDownloadSettings_VideoMessagesTitle: String { return self._s[3817]! } - public var Conversation_PinMessageAlertGroup: String { return self._s[3818]! } - public var Passport_Language_uz: String { return self._s[3819]! } - public var SettingsSearch_Synonyms_Privacy_GroupsAndChannels: String { return self._s[3820]! } - public var Map_StopLiveLocation: String { return self._s[3822]! } - public var VoiceOver_MessageContextSend: String { return self._s[3824]! } - public var PasscodeSettings_Help: String { return self._s[3825]! } - public var NotificationsSound_Input: String { return self._s[3826]! } - public var Share_Title: String { return self._s[3829]! } - public var LogoutOptions_Title: String { return self._s[3830]! } - public var Wallet_Send_AddressText: String { return self._s[3831]! } - public var Login_TermsOfServiceAgree: String { return self._s[3832]! } - public var Compose_NewEncryptedChatTitle: String { return self._s[3833]! } - public var Channel_AdminLog_TitleSelectedEvents: String { return self._s[3834]! } - public var Channel_EditAdmin_PermissionEditMessages: String { return self._s[3835]! } - public var EnterPasscode_EnterTitle: String { return self._s[3836]! } + public var AppWallet_TransactionInfo_FeeInfoURL: String { return self._s[3816]! } + public var Conversation_InputTextCaptionPlaceholder: String { return self._s[3817]! } + public var AutoDownloadSettings_VideoMessagesTitle: String { return self._s[3818]! } + public var Conversation_PinMessageAlertGroup: String { return self._s[3819]! } + public var Passport_Language_uz: String { return self._s[3820]! } + public var SettingsSearch_Synonyms_Privacy_GroupsAndChannels: String { return self._s[3821]! } + public var Map_StopLiveLocation: String { return self._s[3823]! } + public var VoiceOver_MessageContextSend: String { return self._s[3825]! } + public var PasscodeSettings_Help: String { return self._s[3826]! } + public var NotificationsSound_Input: String { return self._s[3827]! } + public var Share_Title: String { return self._s[3830]! } + public var LogoutOptions_Title: String { return self._s[3831]! } + public var Wallet_Send_AddressText: String { return self._s[3832]! } + public var Login_TermsOfServiceAgree: String { return self._s[3833]! } + public var Compose_NewEncryptedChatTitle: String { return self._s[3834]! } + public var Channel_AdminLog_TitleSelectedEvents: String { return self._s[3835]! } + public var Channel_EditAdmin_PermissionEditMessages: String { return self._s[3836]! } + public var EnterPasscode_EnterTitle: String { return self._s[3837]! } public func Call_PrivacyErrorMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3837]!, self._r[3837]!, [_0]) + return formatWithArgumentRanges(self._s[3838]!, self._r[3838]!, [_0]) } - public var Settings_CopyPhoneNumber: String { return self._s[3838]! } - public var Conversation_AddToContacts: String { return self._s[3839]! } + public var Settings_CopyPhoneNumber: String { return self._s[3839]! } + public var Conversation_AddToContacts: String { return self._s[3840]! } public func VoiceOver_Chat_ReplyFrom(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3840]!, self._r[3840]!, [_0]) + return formatWithArgumentRanges(self._s[3841]!, self._r[3841]!, [_0]) } - public var NotificationsSound_Keys: String { return self._s[3841]! } + public var NotificationsSound_Keys: String { return self._s[3842]! } public func Call_ParticipantVersionOutdatedError(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3842]!, self._r[3842]!, [_0]) + return formatWithArgumentRanges(self._s[3843]!, self._r[3843]!, [_0]) } - public var Notification_MessageLifetime1w: String { return self._s[3843]! } - public var Message_Video: String { return self._s[3844]! } - public var AutoDownloadSettings_CellularTitle: String { return self._s[3845]! } + public var Notification_MessageLifetime1w: String { return self._s[3844]! } + public var Message_Video: String { return self._s[3845]! } + public var AutoDownloadSettings_CellularTitle: String { return self._s[3846]! } public func PUSH_CHANNEL_MESSAGE_PHOTO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3846]!, self._r[3846]!, [_1]) + return formatWithArgumentRanges(self._s[3847]!, self._r[3847]!, [_1]) } - public var Wallet_Receive_AmountInfo: String { return self._s[3849]! } - public var Stats_Overview: String { return self._s[3850]! } + public var Wallet_Receive_AmountInfo: String { return self._s[3850]! } + public var Stats_Overview: String { return self._s[3851]! } public func Notification_JoinedChat(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3851]!, self._r[3851]!, [_0]) - } - public func PrivacySettings_LastSeenContactsPlus(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[3852]!, self._r[3852]!, [_0]) } - public var ChatListFolder_ExcludeChatsTitle: String { return self._s[3853]! } - public var Passport_Language_mk: String { return self._s[3854]! } - public var ChatListFolder_CategoryNonContacts: String { return self._s[3855]! } - public func Wallet_Time_PreciseDate_m2(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3856]!, self._r[3856]!, [_1, _2, _3]) + public func PrivacySettings_LastSeenContactsPlus(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3853]!, self._r[3853]!, [_0]) } - public var CreatePoll_CancelConfirmation: String { return self._s[3857]! } - public var MessagePoll_LabelAnonymousQuiz: String { return self._s[3858]! } - public var Conversation_SilentBroadcastTooltipOn: String { return self._s[3860]! } - public var PrivacyPolicy_Decline: String { return self._s[3861]! } - public var Passport_Identity_DoesNotExpire: String { return self._s[3862]! } - public var Channel_AdminLogFilter_EventsRestrictions: String { return self._s[3863]! } - public var AuthSessions_AddDeviceIntro_Action: String { return self._s[3864]! } - public var Permissions_SiriAllow_v0: String { return self._s[3866]! } - public var Wallet_Month_ShortAugust: String { return self._s[3867]! } - public var Appearance_ThemeCarouselNight: String { return self._s[3868]! } + public var ChatListFolder_ExcludeChatsTitle: String { return self._s[3854]! } + public var Passport_Language_mk: String { return self._s[3855]! } + public var ChatListFolder_CategoryNonContacts: String { return self._s[3856]! } + public func Wallet_Time_PreciseDate_m2(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3857]!, self._r[3857]!, [_1, _2, _3]) + } + public var CreatePoll_CancelConfirmation: String { return self._s[3858]! } + public var MessagePoll_LabelAnonymousQuiz: String { return self._s[3859]! } + public var Conversation_SilentBroadcastTooltipOn: String { return self._s[3861]! } + public var PrivacyPolicy_Decline: String { return self._s[3862]! } + public var Passport_Identity_DoesNotExpire: String { return self._s[3863]! } + public var Channel_AdminLogFilter_EventsRestrictions: String { return self._s[3864]! } + public var AuthSessions_AddDeviceIntro_Action: String { return self._s[3865]! } + public var Permissions_SiriAllow_v0: String { return self._s[3867]! } + public var Wallet_Month_ShortAugust: String { return self._s[3868]! } + public var Appearance_ThemeCarouselNight: String { return self._s[3869]! } public func LOCAL_CHAT_MESSAGE_FWDS(_ _1: String, _ _2: Int) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3869]!, self._r[3869]!, [_1, "\(_2)"]) + return formatWithArgumentRanges(self._s[3870]!, self._r[3870]!, [_1, "\(_2)"]) } public func Notification_RenamedChat(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3870]!, self._r[3870]!, [_0]) + return formatWithArgumentRanges(self._s[3871]!, self._r[3871]!, [_0]) } - public var Paint_Regular: String { return self._s[3871]! } - public var ChatSettings_AutoDownloadReset: String { return self._s[3872]! } - public var SocksProxySetup_ShareLink: String { return self._s[3873]! } - public var Wallet_Qr_Title: String { return self._s[3874]! } - public var BlockedUsers_SelectUserTitle: String { return self._s[3875]! } - public var Conversation_Dice: String { return self._s[3876]! } - public var VoiceOver_Chat_RecordModeVoiceMessage: String { return self._s[3878]! } - public var Wallet_Settings_Configuration: String { return self._s[3879]! } - public var GroupInfo_InviteByLink: String { return self._s[3880]! } - public var MessageTimer_Custom: String { return self._s[3881]! } - public var UserInfo_NotificationsDefaultEnabled: String { return self._s[3882]! } - public var Conversation_StopQuizConfirmationTitle: String { return self._s[3883]! } - public var Passport_Address_TypeTemporaryRegistration: String { return self._s[3885]! } - public var Conversation_SendMessage_SetReminder: String { return self._s[3886]! } - public var VoiceOver_Chat_Selected: String { return self._s[3887]! } - public var ChatSettings_AutoDownloadUsingWiFi: String { return self._s[3888]! } - public var Channel_Username_InvalidTaken: String { return self._s[3889]! } - public var Conversation_ClousStorageInfo_Description3: String { return self._s[3890]! } - public var Wallet_WordCheck_TryAgain: String { return self._s[3891]! } - public var Wallet_Info_TransactionPendingHeader: String { return self._s[3892]! } - public var Settings_ChatBackground: String { return self._s[3893]! } - public var Channel_Subscribers_Title: String { return self._s[3894]! } - public var Wallet_Receive_InvoiceUrlHeader: String { return self._s[3895]! } - public var ApplyLanguage_ChangeLanguageTitle: String { return self._s[3896]! } - public var Watch_ConnectionDescription: String { return self._s[3897]! } - public var OldChannels_NoticeText: String { return self._s[3900]! } - public var Wallet_Configuration_ApplyErrorTitle: String { return self._s[3901]! } - public var IntentsSettings_SuggestBy: String { return self._s[3903]! } - public var Theme_ThemeChangedText: String { return self._s[3904]! } - public var ChatList_ArchivedChatsTitle: String { return self._s[3905]! } - public var Wallpaper_ResetWallpapers: String { return self._s[3906]! } - public var Wallet_Send_TransactionInProgress: String { return self._s[3907]! } - public var Conversation_SendDice: String { return self._s[3908]! } - public var EditProfile_Title: String { return self._s[3909]! } - public var NotificationsSound_Bamboo: String { return self._s[3911]! } - public var Channel_AdminLog_MessagePreviousMessage: String { return self._s[3913]! } - public var Login_SmsRequestState2: String { return self._s[3914]! } - public var Passport_Language_ar: String { return self._s[3915]! } + public var Paint_Regular: String { return self._s[3872]! } + public var ChatSettings_AutoDownloadReset: String { return self._s[3873]! } + public var SocksProxySetup_ShareLink: String { return self._s[3874]! } + public var Wallet_Qr_Title: String { return self._s[3875]! } + public var BlockedUsers_SelectUserTitle: String { return self._s[3876]! } + public var Conversation_Dice: String { return self._s[3877]! } + public var VoiceOver_Chat_RecordModeVoiceMessage: String { return self._s[3879]! } + public var Wallet_Settings_Configuration: String { return self._s[3880]! } + public var GroupInfo_InviteByLink: String { return self._s[3881]! } + public var MessageTimer_Custom: String { return self._s[3882]! } + public var UserInfo_NotificationsDefaultEnabled: String { return self._s[3883]! } + public var Conversation_StopQuizConfirmationTitle: String { return self._s[3884]! } + public var Passport_Address_TypeTemporaryRegistration: String { return self._s[3886]! } + public var Conversation_SendMessage_SetReminder: String { return self._s[3887]! } + public var VoiceOver_Chat_Selected: String { return self._s[3888]! } + public var ChatSettings_AutoDownloadUsingWiFi: String { return self._s[3889]! } + public var Channel_Username_InvalidTaken: String { return self._s[3890]! } + public var Conversation_ClousStorageInfo_Description3: String { return self._s[3891]! } + public var Wallet_WordCheck_TryAgain: String { return self._s[3892]! } + public var Wallet_Info_TransactionPendingHeader: String { return self._s[3893]! } + public var Settings_ChatBackground: String { return self._s[3894]! } + public var Channel_Subscribers_Title: String { return self._s[3895]! } + public var Wallet_Receive_InvoiceUrlHeader: String { return self._s[3896]! } + public var ApplyLanguage_ChangeLanguageTitle: String { return self._s[3897]! } + public var Watch_ConnectionDescription: String { return self._s[3898]! } + public var OldChannels_NoticeText: String { return self._s[3901]! } + public var Wallet_Configuration_ApplyErrorTitle: String { return self._s[3902]! } + public var IntentsSettings_SuggestBy: String { return self._s[3904]! } + public var Theme_ThemeChangedText: String { return self._s[3905]! } + public var ChatList_ArchivedChatsTitle: String { return self._s[3906]! } + public var Wallpaper_ResetWallpapers: String { return self._s[3907]! } + public var Wallet_Send_TransactionInProgress: String { return self._s[3908]! } + public var Conversation_SendDice: String { return self._s[3909]! } + public var EditProfile_Title: String { return self._s[3910]! } + public var NotificationsSound_Bamboo: String { return self._s[3912]! } + public var Channel_AdminLog_MessagePreviousMessage: String { return self._s[3914]! } + public var Login_SmsRequestState2: String { return self._s[3915]! } + public var Passport_Language_ar: String { return self._s[3916]! } public func Message_AuthorPinnedGame(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3916]!, self._r[3916]!, [_0]) + return formatWithArgumentRanges(self._s[3917]!, self._r[3917]!, [_0]) } - public var SettingsSearch_Synonyms_EditProfile_Title: String { return self._s[3917]! } - public var Wallet_Created_Text: String { return self._s[3918]! } - public var Conversation_MessageDialogEdit: String { return self._s[3920]! } - public var Wallet_Created_Proceed: String { return self._s[3921]! } - public var Wallet_Words_Done: String { return self._s[3922]! } - public var VoiceOver_Media_PlaybackPause: String { return self._s[3923]! } - public var ChatListFolder_NameChannels: String { return self._s[3924]! } + public var SettingsSearch_Synonyms_EditProfile_Title: String { return self._s[3918]! } + public var Wallet_Created_Text: String { return self._s[3919]! } + public var Conversation_MessageDialogEdit: String { return self._s[3921]! } + public var Wallet_Created_Proceed: String { return self._s[3922]! } + public var Wallet_Words_Done: String { return self._s[3923]! } + public var VoiceOver_Media_PlaybackPause: String { return self._s[3924]! } + public var ChatListFolder_NameChannels: String { return self._s[3925]! } public func PUSH_AUTH_UNKNOWN(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3925]!, self._r[3925]!, [_1]) + return formatWithArgumentRanges(self._s[3926]!, self._r[3926]!, [_1]) } - public var Common_Close: String { return self._s[3926]! } - public var GroupInfo_PublicLink: String { return self._s[3927]! } - public var Channel_OwnershipTransfer_ErrorPrivacyRestricted: String { return self._s[3928]! } - public var SettingsSearch_Synonyms_Notifications_GroupNotificationsPreview: String { return self._s[3929]! } + public var Common_Close: String { return self._s[3927]! } + public var GroupInfo_PublicLink: String { return self._s[3928]! } + public var Channel_OwnershipTransfer_ErrorPrivacyRestricted: String { return self._s[3929]! } + public var SettingsSearch_Synonyms_Notifications_GroupNotificationsPreview: String { return self._s[3930]! } public func Channel_AdminLog_MessageToggleInvitesOff(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3933]!, self._r[3933]!, [_0]) + return formatWithArgumentRanges(self._s[3934]!, self._r[3934]!, [_0]) } - public var UserInfo_About_Placeholder: String { return self._s[3934]! } + public var UserInfo_About_Placeholder: String { return self._s[3935]! } public func Conversation_FileHowToText(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3935]!, self._r[3935]!, [_0]) + return formatWithArgumentRanges(self._s[3936]!, self._r[3936]!, [_0]) } - public var GroupInfo_Permissions_SectionTitle: String { return self._s[3936]! } - public var Channel_Info_Banned: String { return self._s[3938]! } + public var GroupInfo_Permissions_SectionTitle: String { return self._s[3937]! } + public var Channel_Info_Banned: String { return self._s[3939]! } public func Time_MonthOfYear_m11(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3939]!, self._r[3939]!, [_0]) + return formatWithArgumentRanges(self._s[3940]!, self._r[3940]!, [_0]) } - public var Appearance_Other: String { return self._s[3940]! } - public var Passport_Language_my: String { return self._s[3941]! } - public var Group_Setup_BasicHistoryHiddenHelp: String { return self._s[3942]! } + public var Appearance_Other: String { return self._s[3941]! } + public var Passport_Language_my: String { return self._s[3942]! } + public var Group_Setup_BasicHistoryHiddenHelp: String { return self._s[3943]! } public func Time_PreciseDate_m9(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3943]!, self._r[3943]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[3944]!, self._r[3944]!, [_1, _2, _3]) } - public var SettingsSearch_Synonyms_Privacy_PasscodeAndFaceId: String { return self._s[3944]! } - public var IntentsSettings_SuggestedAndSpotlightChatsInfo: String { return self._s[3945]! } - public var Preview_CopyAddress: String { return self._s[3946]! } + public var SettingsSearch_Synonyms_Privacy_PasscodeAndFaceId: String { return self._s[3945]! } + public var IntentsSettings_SuggestedAndSpotlightChatsInfo: String { return self._s[3946]! } + public var Preview_CopyAddress: String { return self._s[3947]! } public func DialogList_SinglePlayingGameSuffix(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3947]!, self._r[3947]!, [_0]) + return formatWithArgumentRanges(self._s[3948]!, self._r[3948]!, [_0]) } - public var KeyCommand_JumpToPreviousChat: String { return self._s[3948]! } - public var UserInfo_BotSettings: String { return self._s[3949]! } - public var LiveLocation_MenuStopAll: String { return self._s[3951]! } - public var Passport_PasswordCreate: String { return self._s[3952]! } - public var StickerSettings_MaskContextInfo: String { return self._s[3953]! } - public var Message_PinnedLocationMessage: String { return self._s[3954]! } - public var Map_Satellite: String { return self._s[3955]! } - public var Watch_Message_Unsupported: String { return self._s[3956]! } - public var Username_TooManyPublicUsernamesError: String { return self._s[3957]! } - public var TwoStepAuth_EnterPasswordInvalid: String { return self._s[3958]! } + public var KeyCommand_JumpToPreviousChat: String { return self._s[3949]! } + public var UserInfo_BotSettings: String { return self._s[3950]! } + public var LiveLocation_MenuStopAll: String { return self._s[3952]! } + public var Passport_PasswordCreate: String { return self._s[3953]! } + public var StickerSettings_MaskContextInfo: String { return self._s[3954]! } + public var Message_PinnedLocationMessage: String { return self._s[3955]! } + public var Map_Satellite: String { return self._s[3956]! } + public var Watch_Message_Unsupported: String { return self._s[3957]! } + public var Username_TooManyPublicUsernamesError: String { return self._s[3958]! } + public var TwoStepAuth_EnterPasswordInvalid: String { return self._s[3959]! } public func Notification_PinnedTextMessage(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3959]!, self._r[3959]!, [_0, _1]) + return formatWithArgumentRanges(self._s[3960]!, self._r[3960]!, [_0, _1]) } public func Conversation_OpenBotLinkText(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3960]!, self._r[3960]!, [_0]) + return formatWithArgumentRanges(self._s[3961]!, self._r[3961]!, [_0]) } - public var Wallet_WordImport_Continue: String { return self._s[3961]! } + public var Wallet_WordImport_Continue: String { return self._s[3962]! } public func TwoFactorSetup_EmailVerification_Text(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3962]!, self._r[3962]!, [_0]) + return formatWithArgumentRanges(self._s[3963]!, self._r[3963]!, [_0]) } - public var Notifications_ChannelNotificationsHelp: String { return self._s[3963]! } - public var Privacy_Calls_P2PContacts: String { return self._s[3964]! } - public var NotificationsSound_None: String { return self._s[3965]! } - public var Wallet_TransactionInfo_StorageFeeHeader: String { return self._s[3966]! } - public var Channel_DiscussionGroup_UnlinkGroup: String { return self._s[3968]! } - public var AccessDenied_VoiceMicrophone: String { return self._s[3969]! } + public var Notifications_ChannelNotificationsHelp: String { return self._s[3964]! } + public var Privacy_Calls_P2PContacts: String { return self._s[3965]! } + public var NotificationsSound_None: String { return self._s[3966]! } + public var Wallet_TransactionInfo_StorageFeeHeader: String { return self._s[3967]! } + public var Channel_DiscussionGroup_UnlinkGroup: String { return self._s[3969]! } + public var AccessDenied_VoiceMicrophone: String { return self._s[3970]! } public func ApplyLanguage_ChangeLanguageAlreadyActive(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3970]!, self._r[3970]!, [_1]) + return formatWithArgumentRanges(self._s[3971]!, self._r[3971]!, [_1]) } - public var Cache_Indexing: String { return self._s[3971]! } - public var DialogList_RecentTitlePeople: String { return self._s[3973]! } - public var DialogList_EncryptionRejected: String { return self._s[3974]! } - public var GroupInfo_Administrators: String { return self._s[3975]! } - public var Passport_ScanPassportHelp: String { return self._s[3976]! } - public var Application_Name: String { return self._s[3977]! } - public var Channel_AdminLogFilter_ChannelEventsInfo: String { return self._s[3978]! } - public var ChatList_PeerTypeGroup: String { return self._s[3979]! } - public var PeopleNearby_MakeVisible: String { return self._s[3981]! } - public var Appearance_ThemeCarouselDay: String { return self._s[3982]! } - public var Stats_GrowthTitle: String { return self._s[3983]! } - public var Passport_Identity_TranslationHelp: String { return self._s[3984]! } + public var Cache_Indexing: String { return self._s[3972]! } + public var DialogList_RecentTitlePeople: String { return self._s[3974]! } + public var DialogList_EncryptionRejected: String { return self._s[3975]! } + public var GroupInfo_Administrators: String { return self._s[3976]! } + public var Passport_ScanPassportHelp: String { return self._s[3977]! } + public var Application_Name: String { return self._s[3978]! } + public var Channel_AdminLogFilter_ChannelEventsInfo: String { return self._s[3979]! } + public var ChatList_PeerTypeGroup: String { return self._s[3980]! } + public var PeopleNearby_MakeVisible: String { return self._s[3982]! } + public var Appearance_ThemeCarouselDay: String { return self._s[3983]! } + public var Stats_GrowthTitle: String { return self._s[3984]! } + public var Passport_Identity_TranslationHelp: String { return self._s[3985]! } public func VoiceOver_Chat_VideoMessageFrom(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3985]!, self._r[3985]!, [_0]) - } - public func Notification_JoinedGroupByLink(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[3986]!, self._r[3986]!, [_0]) } - public func DialogList_EncryptedChatStartedOutgoing(_ _0: String) -> (String, [(Int, NSRange)]) { + public func Notification_JoinedGroupByLink(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[3987]!, self._r[3987]!, [_0]) } - public var Channel_EditAdmin_PermissionDeleteMessages: String { return self._s[3988]! } - public var Privacy_ChatsTitle: String { return self._s[3989]! } - public var DialogList_ClearHistoryConfirmation: String { return self._s[3990]! } - public var SettingsSearch_Synonyms_Data_Storage_ClearCache: String { return self._s[3991]! } - public var Watch_Suggestion_HoldOn: String { return self._s[3992]! } - public var Group_EditAdmin_TransferOwnership: String { return self._s[3993]! } - public var WebBrowser_Title: String { return self._s[3994]! } - public var Group_LinkedChannel: String { return self._s[3995]! } - public var VoiceOver_Chat_SeenByRecipient: String { return self._s[3996]! } - public var SocksProxySetup_RequiredCredentials: String { return self._s[3997]! } - public var Passport_Address_TypeRentalAgreementUploadScan: String { return self._s[3998]! } - public var Appearance_TextSize_UseSystem: String { return self._s[3999]! } - public var TwoStepAuth_EmailSkipAlert: String { return self._s[4000]! } - public var ScheduledMessages_RemindersTitle: String { return self._s[4002]! } - public var Channel_Setup_TypePublic: String { return self._s[4004]! } + public func DialogList_EncryptedChatStartedOutgoing(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3988]!, self._r[3988]!, [_0]) + } + public var Channel_EditAdmin_PermissionDeleteMessages: String { return self._s[3989]! } + public var Privacy_ChatsTitle: String { return self._s[3990]! } + public var DialogList_ClearHistoryConfirmation: String { return self._s[3991]! } + public var SettingsSearch_Synonyms_Data_Storage_ClearCache: String { return self._s[3992]! } + public var Watch_Suggestion_HoldOn: String { return self._s[3993]! } + public var Group_EditAdmin_TransferOwnership: String { return self._s[3994]! } + public var WebBrowser_Title: String { return self._s[3995]! } + public var Group_LinkedChannel: String { return self._s[3996]! } + public var VoiceOver_Chat_SeenByRecipient: String { return self._s[3997]! } + public var SocksProxySetup_RequiredCredentials: String { return self._s[3998]! } + public var Passport_Address_TypeRentalAgreementUploadScan: String { return self._s[3999]! } + public var Appearance_TextSize_UseSystem: String { return self._s[4000]! } + public var TwoStepAuth_EmailSkipAlert: String { return self._s[4001]! } + public var ScheduledMessages_RemindersTitle: String { return self._s[4003]! } + public var Channel_Setup_TypePublic: String { return self._s[4005]! } public func Channel_AdminLog_MessageToggleInvitesOn(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4005]!, self._r[4005]!, [_0]) + return formatWithArgumentRanges(self._s[4006]!, self._r[4006]!, [_0]) } - public var Channel_TypeSetup_Title: String { return self._s[4007]! } - public var MessagePoll_ViewResults: String { return self._s[4008]! } - public var Map_OpenInMaps: String { return self._s[4010]! } + public var Channel_TypeSetup_Title: String { return self._s[4008]! } + public var MessagePoll_ViewResults: String { return self._s[4009]! } + public var Map_OpenInMaps: String { return self._s[4011]! } public func PUSH_PINNED_NOTEXT(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4011]!, self._r[4011]!, [_1]) + return formatWithArgumentRanges(self._s[4012]!, self._r[4012]!, [_1]) } - public var NotificationsSound_Tremolo: String { return self._s[4013]! } + public var NotificationsSound_Tremolo: String { return self._s[4014]! } public func Date_ChatDateHeaderYear(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4014]!, self._r[4014]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[4015]!, self._r[4015]!, [_1, _2, _3]) } - public var ConversationProfile_UnknownAddMemberError: String { return self._s[4015]! } - public var Channel_OwnershipTransfer_PasswordPlaceholder: String { return self._s[4016]! } - public var Passport_PasswordHelp: String { return self._s[4018]! } - public var Login_CodeExpiredError: String { return self._s[4019]! } - public var Channel_EditAdmin_PermissionChangeInfo: String { return self._s[4020]! } - public var Conversation_TitleUnmute: String { return self._s[4021]! } - public var Passport_Identity_ScansHelp: String { return self._s[4022]! } - public var Passport_Language_lo: String { return self._s[4023]! } - public var Camera_FlashAuto: String { return self._s[4024]! } - public var Conversation_OpenBotLinkOpen: String { return self._s[4025]! } - public var Common_Cancel: String { return self._s[4026]! } - public var DialogList_SavedMessagesTooltip: String { return self._s[4027]! } - public var TwoStepAuth_SetupPasswordTitle: String { return self._s[4028]! } - public var Appearance_TintAllColors: String { return self._s[4029]! } + public var ConversationProfile_UnknownAddMemberError: String { return self._s[4016]! } + public var Channel_OwnershipTransfer_PasswordPlaceholder: String { return self._s[4017]! } + public var Passport_PasswordHelp: String { return self._s[4019]! } + public var Login_CodeExpiredError: String { return self._s[4020]! } + public var Channel_EditAdmin_PermissionChangeInfo: String { return self._s[4021]! } + public var Conversation_TitleUnmute: String { return self._s[4022]! } + public var Passport_Identity_ScansHelp: String { return self._s[4023]! } + public var Passport_Language_lo: String { return self._s[4024]! } + public var Camera_FlashAuto: String { return self._s[4025]! } + public var Conversation_OpenBotLinkOpen: String { return self._s[4026]! } + public var Common_Cancel: String { return self._s[4027]! } + public var DialogList_SavedMessagesTooltip: String { return self._s[4028]! } + public var TwoStepAuth_SetupPasswordTitle: String { return self._s[4029]! } + public var Appearance_TintAllColors: String { return self._s[4030]! } public func PUSH_MESSAGE_FWD(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4030]!, self._r[4030]!, [_1]) + return formatWithArgumentRanges(self._s[4031]!, self._r[4031]!, [_1]) } - public var Conversation_ReportSpamConfirmation: String { return self._s[4031]! } - public var ChatSettings_Title: String { return self._s[4033]! } - public var Passport_PasswordReset: String { return self._s[4034]! } - public var SocksProxySetup_TypeNone: String { return self._s[4035]! } - public var EditTheme_Title: String { return self._s[4038]! } - public var PhoneNumberHelp_Help: String { return self._s[4039]! } - public var Checkout_EnterPassword: String { return self._s[4040]! } - public var Activity_UploadingDocument: String { return self._s[4042]! } - public var Share_AuthTitle: String { return self._s[4043]! } - public var State_Connecting: String { return self._s[4044]! } - public var Profile_MessageLifetime1w: String { return self._s[4045]! } - public var Conversation_ContextMenuReport: String { return self._s[4046]! } - public var CheckoutInfo_ReceiverInfoPhone: String { return self._s[4047]! } - public var AutoNightTheme_ScheduledTo: String { return self._s[4048]! } + public var Conversation_ReportSpamConfirmation: String { return self._s[4032]! } + public var ChatSettings_Title: String { return self._s[4034]! } + public var Passport_PasswordReset: String { return self._s[4035]! } + public var SocksProxySetup_TypeNone: String { return self._s[4036]! } + public var EditTheme_Title: String { return self._s[4039]! } + public var PhoneNumberHelp_Help: String { return self._s[4040]! } + public var Checkout_EnterPassword: String { return self._s[4041]! } + public var Activity_UploadingDocument: String { return self._s[4043]! } + public var Share_AuthTitle: String { return self._s[4044]! } + public var State_Connecting: String { return self._s[4045]! } + public var Profile_MessageLifetime1w: String { return self._s[4046]! } + public var Conversation_ContextMenuReport: String { return self._s[4047]! } + public var CheckoutInfo_ReceiverInfoPhone: String { return self._s[4048]! } + public var AutoNightTheme_ScheduledTo: String { return self._s[4049]! } public func VoiceOver_Chat_AnonymousPollFrom(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4049]!, self._r[4049]!, [_0]) + return formatWithArgumentRanges(self._s[4050]!, self._r[4050]!, [_0]) } - public var AuthSessions_Terminate: String { return self._s[4050]! } - public var Wallet_WordImport_CanNotRemember: String { return self._s[4051]! } - public var PeerInfo_PaneAudio: String { return self._s[4052]! } - public var Checkout_NewCard_CardholderNamePlaceholder: String { return self._s[4054]! } - public var KeyCommand_JumpToPreviousUnreadChat: String { return self._s[4055]! } - public var PhotoEditor_Set: String { return self._s[4056]! } - public var EmptyGroupInfo_Title: String { return self._s[4057]! } - public var Login_PadPhoneHelp: String { return self._s[4059]! } - public var AutoDownloadSettings_TypeGroupChats: String { return self._s[4061]! } - public var PrivacyPolicy_DeclineLastWarning: String { return self._s[4063]! } - public var NotificationsSound_Complete: String { return self._s[4064]! } - public var SettingsSearch_Synonyms_Privacy_Data_Title: String { return self._s[4065]! } - public var Group_Info_AdminLog: String { return self._s[4066]! } - public var GroupPermission_NotAvailableInPublicGroups: String { return self._s[4067]! } + public var AuthSessions_Terminate: String { return self._s[4051]! } + public var Wallet_WordImport_CanNotRemember: String { return self._s[4052]! } + public var PeerInfo_PaneAudio: String { return self._s[4053]! } + public var Checkout_NewCard_CardholderNamePlaceholder: String { return self._s[4055]! } + public var KeyCommand_JumpToPreviousUnreadChat: String { return self._s[4056]! } + public var PhotoEditor_Set: String { return self._s[4057]! } + public var EmptyGroupInfo_Title: String { return self._s[4058]! } + public var Login_PadPhoneHelp: String { return self._s[4060]! } + public var AutoDownloadSettings_TypeGroupChats: String { return self._s[4062]! } + public var PrivacyPolicy_DeclineLastWarning: String { return self._s[4064]! } + public var NotificationsSound_Complete: String { return self._s[4065]! } + public var SettingsSearch_Synonyms_Privacy_Data_Title: String { return self._s[4066]! } + public var Group_Info_AdminLog: String { return self._s[4067]! } + public var GroupPermission_NotAvailableInPublicGroups: String { return self._s[4068]! } public func Wallet_Time_PreciseDate_m11(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4068]!, self._r[4068]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[4069]!, self._r[4069]!, [_1, _2, _3]) } - public var Channel_AdminLog_InfoPanelAlertText: String { return self._s[4069]! } - public var Group_Location_CreateInThisPlace: String { return self._s[4071]! } - public var Conversation_Admin: String { return self._s[4072]! } - public var Conversation_GifTooltip: String { return self._s[4073]! } - public var Passport_NotLoggedInMessage: String { return self._s[4074]! } + public var Channel_AdminLog_InfoPanelAlertText: String { return self._s[4070]! } + public var Group_Location_CreateInThisPlace: String { return self._s[4072]! } + public var Conversation_Admin: String { return self._s[4073]! } + public var Conversation_GifTooltip: String { return self._s[4074]! } + public var Passport_NotLoggedInMessage: String { return self._s[4075]! } public func AutoDownloadSettings_OnFor(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4076]!, self._r[4076]!, [_0]) + return formatWithArgumentRanges(self._s[4077]!, self._r[4077]!, [_0]) } - public var Profile_MessageLifetimeForever: String { return self._s[4077]! } - public var SharedMedia_EmptyTitle: String { return self._s[4079]! } - public var Channel_Edit_PrivatePublicLinkAlert: String { return self._s[4081]! } - public var Username_Help: String { return self._s[4082]! } - public var DialogList_LanguageTooltip: String { return self._s[4084]! } - public var Map_LoadError: String { return self._s[4085]! } - public var Login_PhoneNumberAlreadyAuthorized: String { return self._s[4086]! } - public var Channel_AdminLog_AddMembers: String { return self._s[4087]! } - public var ArchivedChats_IntroTitle2: String { return self._s[4088]! } - public var Notification_Exceptions_NewException: String { return self._s[4089]! } - public var TwoStepAuth_EmailTitle: String { return self._s[4090]! } - public var WatchRemote_AlertText: String { return self._s[4091]! } + public var Profile_MessageLifetimeForever: String { return self._s[4078]! } + public var SharedMedia_EmptyTitle: String { return self._s[4080]! } + public var Channel_Edit_PrivatePublicLinkAlert: String { return self._s[4082]! } + public var Username_Help: String { return self._s[4083]! } + public var DialogList_LanguageTooltip: String { return self._s[4085]! } + public var Map_LoadError: String { return self._s[4086]! } + public var Login_PhoneNumberAlreadyAuthorized: String { return self._s[4087]! } + public var Channel_AdminLog_AddMembers: String { return self._s[4088]! } + public var ArchivedChats_IntroTitle2: String { return self._s[4089]! } + public var Notification_Exceptions_NewException: String { return self._s[4090]! } + public var TwoStepAuth_EmailTitle: String { return self._s[4091]! } + public var WatchRemote_AlertText: String { return self._s[4092]! } public func Wallet_Send_ConfirmationText(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4092]!, self._r[4092]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[4093]!, self._r[4093]!, [_1, _2, _3]) } - public var ChatSettings_ConnectionType_Title: String { return self._s[4096]! } + public var ChatSettings_ConnectionType_Title: String { return self._s[4097]! } public func PUSH_PINNED_QUIZ(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4097]!, self._r[4097]!, [_1, _2]) + return formatWithArgumentRanges(self._s[4098]!, self._r[4098]!, [_1, _2]) } public func Settings_CheckPhoneNumberTitle(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4098]!, self._r[4098]!, [_0]) + return formatWithArgumentRanges(self._s[4099]!, self._r[4099]!, [_0]) } - public var SettingsSearch_Synonyms_Calls_CallTab: String { return self._s[4099]! } - public var WebBrowser_DefaultBrowser: String { return self._s[4100]! } - public var Passport_Address_CountryPlaceholder: String { return self._s[4101]! } + public var SettingsSearch_Synonyms_Calls_CallTab: String { return self._s[4100]! } + public var WebBrowser_DefaultBrowser: String { return self._s[4101]! } + public var Passport_Address_CountryPlaceholder: String { return self._s[4102]! } public func DialogList_AwaitingEncryption(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4102]!, self._r[4102]!, [_0]) + return formatWithArgumentRanges(self._s[4103]!, self._r[4103]!, [_0]) } public func Time_PreciseDate_m6(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4103]!, self._r[4103]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[4104]!, self._r[4104]!, [_1, _2, _3]) } - public var Group_AdminLog_EmptyText: String { return self._s[4104]! } - public var SettingsSearch_Synonyms_Appearance_Title: String { return self._s[4105]! } - public var Conversation_PrivateChannelTooltip: String { return self._s[4107]! } - public var Wallet_Created_ExportErrorText: String { return self._s[4108]! } - public var ChatList_UndoArchiveText1: String { return self._s[4109]! } - public var ChatListFolder_IncludedSectionHeader: String { return self._s[4110]! } - public var AccessDenied_VideoMicrophone: String { return self._s[4111]! } - public var Conversation_ContextMenuStickerPackAdd: String { return self._s[4112]! } - public var Cache_ClearNone: String { return self._s[4113]! } - public var SocksProxySetup_FailedToConnect: String { return self._s[4114]! } - public var Permissions_NotificationsTitle_v0: String { return self._s[4115]! } + public var Group_AdminLog_EmptyText: String { return self._s[4105]! } + public var SettingsSearch_Synonyms_Appearance_Title: String { return self._s[4106]! } + public var Conversation_PrivateChannelTooltip: String { return self._s[4108]! } + public var Wallet_Created_ExportErrorText: String { return self._s[4109]! } + public var ChatList_UndoArchiveText1: String { return self._s[4110]! } + public var ChatListFolder_IncludedSectionHeader: String { return self._s[4111]! } + public var AccessDenied_VideoMicrophone: String { return self._s[4112]! } + public var Conversation_ContextMenuStickerPackAdd: String { return self._s[4113]! } + public var Cache_ClearNone: String { return self._s[4114]! } + public var SocksProxySetup_FailedToConnect: String { return self._s[4115]! } + public var Permissions_NotificationsTitle_v0: String { return self._s[4116]! } public func Channel_AdminLog_MessageEdited(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4116]!, self._r[4116]!, [_0]) + return formatWithArgumentRanges(self._s[4117]!, self._r[4117]!, [_0]) } - public var Passport_Identity_Country: String { return self._s[4117]! } + public var Passport_Identity_Country: String { return self._s[4118]! } public func ChatSettings_AutoDownloadSettings_TypeFile(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4118]!, self._r[4118]!, [_0]) - } - public func Notification_CreatedChat(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[4119]!, self._r[4119]!, [_0]) } - public var Exceptions_AddToExceptions: String { return self._s[4120]! } - public var AccessDenied_Settings: String { return self._s[4121]! } - public var Passport_Address_TypeUtilityBillUploadScan: String { return self._s[4122]! } - public var Month_ShortMay: String { return self._s[4124]! } - public var Compose_NewGroup: String { return self._s[4126]! } - public var Group_Setup_TypePrivate: String { return self._s[4128]! } - public var Login_PadPhoneHelpTitle: String { return self._s[4130]! } - public var Appearance_ThemeDayClassic: String { return self._s[4131]! } - public var Channel_AdminLog_MessagePreviousCaption: String { return self._s[4132]! } - public var AutoDownloadSettings_OffForAll: String { return self._s[4133]! } - public var Privacy_GroupsAndChannels_WhoCanAddMe: String { return self._s[4134]! } - public var Conversation_typing: String { return self._s[4136]! } - public var Undo_ScheduledMessagesCleared: String { return self._s[4137]! } - public var Paint_Masks: String { return self._s[4138]! } - public var Contacts_DeselectAll: String { return self._s[4139]! } - public func Wallet_Updated_YesterdayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4140]!, self._r[4140]!, [_0]) + public func Notification_CreatedChat(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[4120]!, self._r[4120]!, [_0]) } - public var CreatePoll_MultipleChoiceQuizAlert: String { return self._s[4141]! } - public var Username_InvalidTaken: String { return self._s[4142]! } - public var Call_StatusNoAnswer: String { return self._s[4143]! } - public var TwoStepAuth_EmailAddSuccess: String { return self._s[4144]! } - public var SettingsSearch_Synonyms_Privacy_BlockedUsers: String { return self._s[4145]! } - public var Passport_Identity_Selfie: String { return self._s[4146]! } - public var Login_InfoLastNamePlaceholder: String { return self._s[4147]! } - public var Privacy_SecretChatsLinkPreviewsHelp: String { return self._s[4148]! } - public var Conversation_ClearSecretHistory: String { return self._s[4149]! } - public var PeopleNearby_Description: String { return self._s[4151]! } - public var NetworkUsageSettings_Title: String { return self._s[4152]! } - public var Your_cards_security_code_is_invalid: String { return self._s[4154]! } - public var Stats_EnabledNotifications: String { return self._s[4155]! } + public var Exceptions_AddToExceptions: String { return self._s[4121]! } + public var AccessDenied_Settings: String { return self._s[4122]! } + public var Passport_Address_TypeUtilityBillUploadScan: String { return self._s[4123]! } + public var Month_ShortMay: String { return self._s[4125]! } + public var Compose_NewGroup: String { return self._s[4127]! } + public var Group_Setup_TypePrivate: String { return self._s[4129]! } + public var Login_PadPhoneHelpTitle: String { return self._s[4131]! } + public var Appearance_ThemeDayClassic: String { return self._s[4132]! } + public var Channel_AdminLog_MessagePreviousCaption: String { return self._s[4133]! } + public var AutoDownloadSettings_OffForAll: String { return self._s[4134]! } + public var Privacy_GroupsAndChannels_WhoCanAddMe: String { return self._s[4135]! } + public var Conversation_typing: String { return self._s[4137]! } + public var Undo_ScheduledMessagesCleared: String { return self._s[4138]! } + public var Paint_Masks: String { return self._s[4139]! } + public var Contacts_DeselectAll: String { return self._s[4140]! } + public func Wallet_Updated_YesterdayAt(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[4141]!, self._r[4141]!, [_0]) + } + public var CreatePoll_MultipleChoiceQuizAlert: String { return self._s[4142]! } + public var Username_InvalidTaken: String { return self._s[4143]! } + public var Call_StatusNoAnswer: String { return self._s[4144]! } + public var TwoStepAuth_EmailAddSuccess: String { return self._s[4145]! } + public var SettingsSearch_Synonyms_Privacy_BlockedUsers: String { return self._s[4146]! } + public var Passport_Identity_Selfie: String { return self._s[4147]! } + public var Login_InfoLastNamePlaceholder: String { return self._s[4148]! } + public var Privacy_SecretChatsLinkPreviewsHelp: String { return self._s[4149]! } + public var Conversation_ClearSecretHistory: String { return self._s[4150]! } + public var PeopleNearby_Description: String { return self._s[4152]! } + public var NetworkUsageSettings_Title: String { return self._s[4153]! } + public var Your_cards_security_code_is_invalid: String { return self._s[4155]! } + public var Stats_EnabledNotifications: String { return self._s[4156]! } public func Notification_LeftChannel(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4157]!, self._r[4157]!, [_0]) + return formatWithArgumentRanges(self._s[4158]!, self._r[4158]!, [_0]) } public func Call_CallInProgressMessage(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4158]!, self._r[4158]!, [_1, _2]) + return formatWithArgumentRanges(self._s[4159]!, self._r[4159]!, [_1, _2]) } - public var SaveIncomingPhotosSettings_From: String { return self._s[4160]! } - public var VoiceOver_Navigation_Search: String { return self._s[4161]! } - public var Map_LiveLocationTitle: String { return self._s[4162]! } - public var Login_InfoAvatarAdd: String { return self._s[4163]! } - public var Passport_Identity_FilesView: String { return self._s[4164]! } - public var ChatListFolderSettings_Title: String { return self._s[4165]! } - public var UserInfo_GenericPhoneLabel: String { return self._s[4166]! } - public var Privacy_Calls_NeverAllow: String { return self._s[4167]! } - public var VoiceOver_Chat_File: String { return self._s[4168]! } - public var Wallet_Settings_DeleteWalletInfo: String { return self._s[4169]! } + public var SaveIncomingPhotosSettings_From: String { return self._s[4161]! } + public var VoiceOver_Navigation_Search: String { return self._s[4162]! } + public var Map_LiveLocationTitle: String { return self._s[4163]! } + public var Login_InfoAvatarAdd: String { return self._s[4164]! } + public var Passport_Identity_FilesView: String { return self._s[4165]! } + public var ChatListFolderSettings_Title: String { return self._s[4166]! } + public var UserInfo_GenericPhoneLabel: String { return self._s[4167]! } + public var Privacy_Calls_NeverAllow: String { return self._s[4168]! } + public var VoiceOver_Chat_File: String { return self._s[4169]! } + public var Wallet_Settings_DeleteWalletInfo: String { return self._s[4170]! } public func Contacts_AddPhoneNumber(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4170]!, self._r[4170]!, [_0]) + return formatWithArgumentRanges(self._s[4171]!, self._r[4171]!, [_0]) } - public var ChatList_EmptyChatList: String { return self._s[4171]! } - public var ContactInfo_PhoneNumberHidden: String { return self._s[4172]! } - public var TwoStepAuth_ConfirmationText: String { return self._s[4173]! } - public var ChatSettings_AutomaticVideoMessageDownload: String { return self._s[4174]! } + public var ChatList_EmptyChatList: String { return self._s[4172]! } + public var ContactInfo_PhoneNumberHidden: String { return self._s[4173]! } + public var TwoStepAuth_ConfirmationText: String { return self._s[4174]! } + public var ChatSettings_AutomaticVideoMessageDownload: String { return self._s[4175]! } public func PUSH_CHAT_MESSAGE_VIDEOS(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4175]!, self._r[4175]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[4176]!, self._r[4176]!, [_1, _2, _3]) } - public var Channel_AdminLogFilter_AdminsAll: String { return self._s[4176]! } - public var Wallet_Intro_CreateErrorText: String { return self._s[4177]! } - public var Tour_Title2: String { return self._s[4178]! } - public var Wallet_Sent_ViewWallet: String { return self._s[4179]! } - public var Conversation_FileOpenIn: String { return self._s[4180]! } - public var Checkout_ErrorPrecheckoutFailed: String { return self._s[4181]! } - public var Wallet_Send_ErrorInvalidAddress: String { return self._s[4182]! } - public var Wallpaper_Set: String { return self._s[4183]! } - public var Passport_Identity_Translations: String { return self._s[4185]! } + public var Channel_AdminLogFilter_AdminsAll: String { return self._s[4177]! } + public var Wallet_Intro_CreateErrorText: String { return self._s[4178]! } + public var Tour_Title2: String { return self._s[4179]! } + public var Wallet_Sent_ViewWallet: String { return self._s[4180]! } + public var Conversation_FileOpenIn: String { return self._s[4181]! } + public var Checkout_ErrorPrecheckoutFailed: String { return self._s[4182]! } + public var Wallet_Send_ErrorInvalidAddress: String { return self._s[4183]! } + public var Wallpaper_Set: String { return self._s[4184]! } + public var Passport_Identity_Translations: String { return self._s[4186]! } public func Channel_AdminLog_MessageChangedChannelAbout(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4186]!, self._r[4186]!, [_0]) + return formatWithArgumentRanges(self._s[4187]!, self._r[4187]!, [_0]) } - public var Channel_LeaveChannel: String { return self._s[4187]! } + public var Channel_LeaveChannel: String { return self._s[4188]! } public func PINNED_INVOICE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4188]!, self._r[4188]!, [_1]) + return formatWithArgumentRanges(self._s[4189]!, self._r[4189]!, [_1]) } - public var SettingsSearch_Synonyms_Proxy_AddProxy: String { return self._s[4190]! } - public var PhotoEditor_HighlightsTint: String { return self._s[4191]! } - public var MessagePoll_LabelPoll: String { return self._s[4192]! } - public var Passport_Email_Delete: String { return self._s[4193]! } - public var Conversation_Mute: String { return self._s[4195]! } - public var Channel_AddBotAsAdmin: String { return self._s[4196]! } - public var Channel_AdminLog_CanSendMessages: String { return self._s[4198]! } - public var Wallet_Configuration_BlockchainNameChangedText: String { return self._s[4199]! } - public var ChatSettings_IntentsSettings: String { return self._s[4201]! } - public var Channel_Management_LabelOwner: String { return self._s[4202]! } + public var SettingsSearch_Synonyms_Proxy_AddProxy: String { return self._s[4191]! } + public var PhotoEditor_HighlightsTint: String { return self._s[4192]! } + public var MessagePoll_LabelPoll: String { return self._s[4193]! } + public var Passport_Email_Delete: String { return self._s[4194]! } + public var Conversation_Mute: String { return self._s[4196]! } + public var Channel_AddBotAsAdmin: String { return self._s[4197]! } + public var Channel_AdminLog_CanSendMessages: String { return self._s[4199]! } + public var Wallet_Configuration_BlockchainNameChangedText: String { return self._s[4200]! } + public var ChatSettings_IntentsSettings: String { return self._s[4202]! } + public var Channel_Management_LabelOwner: String { return self._s[4203]! } public func Notification_PassportValuesSentMessage(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4203]!, self._r[4203]!, [_1, _2]) + return formatWithArgumentRanges(self._s[4204]!, self._r[4204]!, [_1, _2]) } - public var Calls_CallTabDescription: String { return self._s[4204]! } - public var Passport_Identity_NativeNameHelp: String { return self._s[4205]! } - public var Common_No: String { return self._s[4206]! } - public var Weekday_Sunday: String { return self._s[4207]! } - public var Notification_Reply: String { return self._s[4208]! } - public var Conversation_ViewMessage: String { return self._s[4209]! } + public var Calls_CallTabDescription: String { return self._s[4205]! } + public var Passport_Identity_NativeNameHelp: String { return self._s[4206]! } + public var Common_No: String { return self._s[4207]! } + public var Weekday_Sunday: String { return self._s[4208]! } + public var Notification_Reply: String { return self._s[4209]! } + public var Conversation_ViewMessage: String { return self._s[4210]! } public func Checkout_SavePasswordTimeoutAndFaceId(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4210]!, self._r[4210]!, [_0]) - } - public func Map_LiveLocationPrivateDescription(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[4211]!, self._r[4211]!, [_0]) } + public func Map_LiveLocationPrivateDescription(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[4212]!, self._r[4212]!, [_0]) + } public func Wallet_Time_PreciseDate_m7(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4212]!, self._r[4212]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[4213]!, self._r[4213]!, [_1, _2, _3]) } - public var SettingsSearch_Synonyms_EditProfile_AddAccount: String { return self._s[4213]! } - public var Wallet_Send_Title: String { return self._s[4214]! } - public var Message_PinnedDocumentMessage: String { return self._s[4215]! } - public var Wallet_Info_RefreshErrorText: String { return self._s[4216]! } - public var DialogList_TabTitle: String { return self._s[4218]! } - public var ChatSettings_AutoPlayTitle: String { return self._s[4219]! } - public var Passport_FieldEmail: String { return self._s[4220]! } - public var Conversation_UnpinMessageAlert: String { return self._s[4221]! } - public var Passport_Address_TypeBankStatement: String { return self._s[4222]! } - public var Wallet_SecureStorageReset_Title: String { return self._s[4223]! } - public var Passport_Identity_ExpiryDate: String { return self._s[4224]! } - public var Privacy_Calls_P2P: String { return self._s[4225]! } + public var SettingsSearch_Synonyms_EditProfile_AddAccount: String { return self._s[4214]! } + public var Wallet_Send_Title: String { return self._s[4215]! } + public var Message_PinnedDocumentMessage: String { return self._s[4216]! } + public var Wallet_Info_RefreshErrorText: String { return self._s[4217]! } + public var DialogList_TabTitle: String { return self._s[4219]! } + public var ChatSettings_AutoPlayTitle: String { return self._s[4220]! } + public var Passport_FieldEmail: String { return self._s[4221]! } + public var Conversation_UnpinMessageAlert: String { return self._s[4222]! } + public var Passport_Address_TypeBankStatement: String { return self._s[4223]! } + public var Wallet_SecureStorageReset_Title: String { return self._s[4224]! } + public var Passport_Identity_ExpiryDate: String { return self._s[4225]! } + public var Privacy_Calls_P2P: String { return self._s[4226]! } public func CancelResetAccount_Success(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4227]!, self._r[4227]!, [_0]) + return formatWithArgumentRanges(self._s[4228]!, self._r[4228]!, [_0]) } - public var SocksProxySetup_UseForCallsHelp: String { return self._s[4228]! } + public var SocksProxySetup_UseForCallsHelp: String { return self._s[4229]! } public func PUSH_CHAT_ALBUM(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4229]!, self._r[4229]!, [_1, _2]) + return formatWithArgumentRanges(self._s[4230]!, self._r[4230]!, [_1, _2]) } - public var Stickers_ClearRecent: String { return self._s[4230]! } - public var EnterPasscode_ChangeTitle: String { return self._s[4231]! } - public var TwoFactorSetup_Email_Title: String { return self._s[4232]! } - public var Passport_InfoText: String { return self._s[4233]! } - public var Checkout_NewCard_SaveInfoEnableHelp: String { return self._s[4234]! } + public var Stickers_ClearRecent: String { return self._s[4231]! } + public var EnterPasscode_ChangeTitle: String { return self._s[4232]! } + public var TwoFactorSetup_Email_Title: String { return self._s[4233]! } + public var Passport_InfoText: String { return self._s[4234]! } + public var Checkout_NewCard_SaveInfoEnableHelp: String { return self._s[4235]! } public func Login_InvalidPhoneEmailSubject(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4235]!, self._r[4235]!, [_0]) + return formatWithArgumentRanges(self._s[4236]!, self._r[4236]!, [_0]) } public func Time_PreciseDate_m3(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4236]!, self._r[4236]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[4237]!, self._r[4237]!, [_1, _2, _3]) } - public var SettingsSearch_Synonyms_Notifications_BadgeIncludeMutedChannels: String { return self._s[4237]! } - public var ScheduledMessages_PollUnavailable: String { return self._s[4238]! } - public var VoiceOver_Navigation_Compose: String { return self._s[4239]! } - public var Passport_Identity_EditDriversLicense: String { return self._s[4240]! } - public var Conversation_TapAndHoldToRecord: String { return self._s[4242]! } - public var SettingsSearch_Synonyms_Notifications_BadgeIncludeMutedChats: String { return self._s[4243]! } + public var SettingsSearch_Synonyms_Notifications_BadgeIncludeMutedChannels: String { return self._s[4238]! } + public var ScheduledMessages_PollUnavailable: String { return self._s[4239]! } + public var VoiceOver_Navigation_Compose: String { return self._s[4240]! } + public var Passport_Identity_EditDriversLicense: String { return self._s[4241]! } + public var Conversation_TapAndHoldToRecord: String { return self._s[4243]! } + public var SettingsSearch_Synonyms_Notifications_BadgeIncludeMutedChats: String { return self._s[4244]! } public func Notification_CallTimeFormat(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4244]!, self._r[4244]!, [_1, _2]) + return formatWithArgumentRanges(self._s[4245]!, self._r[4245]!, [_1, _2]) } - public var Channel_EditAdmin_PermissionInviteViaLink: String { return self._s[4247]! } - public var ChatSettings_OpenLinksIn: String { return self._s[4248]! } - public var Map_HomeAndWorkTitle: String { return self._s[4249]! } + public var Channel_EditAdmin_PermissionInviteViaLink: String { return self._s[4248]! } + public var ChatSettings_OpenLinksIn: String { return self._s[4249]! } + public var Map_HomeAndWorkTitle: String { return self._s[4250]! } public func Generic_OpenHiddenLinkAlert(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4251]!, self._r[4251]!, [_0]) + return formatWithArgumentRanges(self._s[4252]!, self._r[4252]!, [_0]) } - public var DialogList_Unread: String { return self._s[4252]! } + public var DialogList_Unread: String { return self._s[4253]! } public func PUSH_CHAT_MESSAGE_GIF(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4253]!, self._r[4253]!, [_1, _2]) + return formatWithArgumentRanges(self._s[4254]!, self._r[4254]!, [_1, _2]) } - public var User_DeletedAccount: String { return self._s[4254]! } - public var ChatList_TabIconFoldersTooltipEmptyFolders: String { return self._s[4255]! } - public var OwnershipTransfer_SetupTwoStepAuth: String { return self._s[4256]! } + public var User_DeletedAccount: String { return self._s[4255]! } + public var ChatList_TabIconFoldersTooltipEmptyFolders: String { return self._s[4256]! } + public var OwnershipTransfer_SetupTwoStepAuth: String { return self._s[4257]! } public func Watch_Time_ShortYesterdayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4257]!, self._r[4257]!, [_0]) + return formatWithArgumentRanges(self._s[4258]!, self._r[4258]!, [_0]) } - public var UserInfo_NotificationsDefault: String { return self._s[4258]! } - public var SharedMedia_CategoryMedia: String { return self._s[4259]! } - public var SocksProxySetup_ProxyStatusUnavailable: String { return self._s[4260]! } - public var Channel_AdminLog_MessageRestrictedForever: String { return self._s[4261]! } - public var Watch_ChatList_Compose: String { return self._s[4262]! } - public var Notifications_MessageNotificationsExceptionsHelp: String { return self._s[4263]! } - public var AutoDownloadSettings_Delimeter: String { return self._s[4264]! } - public var Watch_Microphone_Access: String { return self._s[4265]! } - public var Group_Setup_HistoryHeader: String { return self._s[4266]! } - public var Map_SetThisLocation: String { return self._s[4267]! } - public var Appearance_ThemePreview_Chat_2_ReplyName: String { return self._s[4268]! } - public var Activity_UploadingPhoto: String { return self._s[4269]! } - public var Conversation_Edit: String { return self._s[4271]! } - public var Group_ErrorSendRestrictedMedia: String { return self._s[4272]! } - public var Login_TermsOfServiceDecline: String { return self._s[4273]! } - public var Message_PinnedContactMessage: String { return self._s[4274]! } + public var UserInfo_NotificationsDefault: String { return self._s[4259]! } + public var SharedMedia_CategoryMedia: String { return self._s[4260]! } + public var SocksProxySetup_ProxyStatusUnavailable: String { return self._s[4261]! } + public var Channel_AdminLog_MessageRestrictedForever: String { return self._s[4262]! } + public var Watch_ChatList_Compose: String { return self._s[4263]! } + public var Notifications_MessageNotificationsExceptionsHelp: String { return self._s[4264]! } + public var AutoDownloadSettings_Delimeter: String { return self._s[4265]! } + public var Watch_Microphone_Access: String { return self._s[4266]! } + public var Group_Setup_HistoryHeader: String { return self._s[4267]! } + public var Map_SetThisLocation: String { return self._s[4268]! } + public var Appearance_ThemePreview_Chat_2_ReplyName: String { return self._s[4269]! } + public var Activity_UploadingPhoto: String { return self._s[4270]! } + public var Conversation_Edit: String { return self._s[4272]! } + public var Group_ErrorSendRestrictedMedia: String { return self._s[4273]! } + public var Login_TermsOfServiceDecline: String { return self._s[4274]! } + public var Message_PinnedContactMessage: String { return self._s[4275]! } public func Channel_AdminLog_MessageRestrictedNameUsername(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4275]!, self._r[4275]!, [_1, _2]) + return formatWithArgumentRanges(self._s[4276]!, self._r[4276]!, [_1, _2]) } public func Login_PhoneBannedEmailBody(_ _1: String, _ _2: String, _ _3: String, _ _4: String, _ _5: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4276]!, self._r[4276]!, [_1, _2, _3, _4, _5]) + return formatWithArgumentRanges(self._s[4277]!, self._r[4277]!, [_1, _2, _3, _4, _5]) } - public var Appearance_LargeEmoji: String { return self._s[4277]! } - public var TwoStepAuth_AdditionalPassword: String { return self._s[4279]! } - public var EditTheme_Edit_Preview_IncomingReplyText: String { return self._s[4280]! } + public var Appearance_LargeEmoji: String { return self._s[4278]! } + public var TwoStepAuth_AdditionalPassword: String { return self._s[4280]! } + public var EditTheme_Edit_Preview_IncomingReplyText: String { return self._s[4281]! } public func PUSH_CHAT_DELETE_YOU(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4281]!, self._r[4281]!, [_1, _2]) + return formatWithArgumentRanges(self._s[4282]!, self._r[4282]!, [_1, _2]) } - public var Passport_Phone_EnterOtherNumber: String { return self._s[4282]! } - public var Message_PinnedPhotoMessage: String { return self._s[4283]! } - public var Passport_FieldPhone: String { return self._s[4284]! } - public var TwoStepAuth_RecoveryEmailAddDescription: String { return self._s[4285]! } - public var Stats_NotificationsTitle: String { return self._s[4286]! } - public var ChatSettings_AutoPlayGifs: String { return self._s[4287]! } - public var InfoPlist_NSCameraUsageDescription: String { return self._s[4289]! } - public var Conversation_Call: String { return self._s[4290]! } - public var Common_TakePhoto: String { return self._s[4292]! } - public var Group_EditAdmin_RankTitle: String { return self._s[4293]! } - public var Wallet_Receive_CommentHeader: String { return self._s[4294]! } - public var Channel_NotificationLoading: String { return self._s[4295]! } + public var Passport_Phone_EnterOtherNumber: String { return self._s[4283]! } + public var Message_PinnedPhotoMessage: String { return self._s[4284]! } + public var Passport_FieldPhone: String { return self._s[4285]! } + public var TwoStepAuth_RecoveryEmailAddDescription: String { return self._s[4286]! } + public var Stats_NotificationsTitle: String { return self._s[4287]! } + public var ChatSettings_AutoPlayGifs: String { return self._s[4288]! } + public var InfoPlist_NSCameraUsageDescription: String { return self._s[4290]! } + public var Conversation_Call: String { return self._s[4291]! } + public var Common_TakePhoto: String { return self._s[4293]! } + public var Group_EditAdmin_RankTitle: String { return self._s[4294]! } + public var Wallet_Receive_CommentHeader: String { return self._s[4295]! } + public var Channel_NotificationLoading: String { return self._s[4296]! } public func Notification_Exceptions_Sound(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4296]!, self._r[4296]!, [_0]) - } - public func ScheduledMessages_ScheduledDate(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[4297]!, self._r[4297]!, [_0]) } + public func ScheduledMessages_ScheduledDate(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[4298]!, self._r[4298]!, [_0]) + } public func PUSH_CHANNEL_MESSAGE_VIDEO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4298]!, self._r[4298]!, [_1]) + return formatWithArgumentRanges(self._s[4299]!, self._r[4299]!, [_1]) } - public var Permissions_SiriTitle_v0: String { return self._s[4299]! } + public var Permissions_SiriTitle_v0: String { return self._s[4300]! } public func VoiceOver_Chat_VoiceMessageFrom(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4300]!, self._r[4300]!, [_0]) - } - public func Login_ResetAccountProtected_Text(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[4301]!, self._r[4301]!, [_0]) } - public var Channel_MessagePhotoRemoved: String { return self._s[4302]! } - public var Wallet_Info_ReceiveGrams: String { return self._s[4303]! } - public var ClearCache_FreeSpace: String { return self._s[4304]! } - public var Appearance_BubbleCorners_Apply: String { return self._s[4305]! } - public var Common_edit: String { return self._s[4306]! } - public var PrivacySettings_AuthSessions: String { return self._s[4307]! } - public var Month_ShortJune: String { return self._s[4308]! } - public var PrivacyLastSeenSettings_AlwaysShareWith_Placeholder: String { return self._s[4309]! } - public var Call_ReportSend: String { return self._s[4310]! } - public var Watch_LastSeen_JustNow: String { return self._s[4311]! } - public var Notifications_MessageNotifications: String { return self._s[4312]! } - public var WallpaperSearch_ColorGreen: String { return self._s[4313]! } - public var BroadcastListInfo_AddRecipient: String { return self._s[4315]! } - public var Group_Status: String { return self._s[4316]! } + public func Login_ResetAccountProtected_Text(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[4302]!, self._r[4302]!, [_0]) + } + public var Channel_MessagePhotoRemoved: String { return self._s[4303]! } + public var Wallet_Info_ReceiveGrams: String { return self._s[4304]! } + public var ClearCache_FreeSpace: String { return self._s[4305]! } + public var Appearance_BubbleCorners_Apply: String { return self._s[4306]! } + public var Common_edit: String { return self._s[4307]! } + public var PrivacySettings_AuthSessions: String { return self._s[4308]! } + public var Month_ShortJune: String { return self._s[4309]! } + public var PrivacyLastSeenSettings_AlwaysShareWith_Placeholder: String { return self._s[4310]! } + public var Call_ReportSend: String { return self._s[4311]! } + public var Watch_LastSeen_JustNow: String { return self._s[4312]! } + public var Notifications_MessageNotifications: String { return self._s[4313]! } + public var WallpaperSearch_ColorGreen: String { return self._s[4314]! } + public var BroadcastListInfo_AddRecipient: String { return self._s[4316]! } + public var Group_Status: String { return self._s[4317]! } public func AutoNightTheme_LocationHelp(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4317]!, self._r[4317]!, [_0, _1]) + return formatWithArgumentRanges(self._s[4318]!, self._r[4318]!, [_0, _1]) } - public var TextFormat_AddLinkTitle: String { return self._s[4318]! } - public var ShareMenu_ShareTo: String { return self._s[4319]! } - public var Conversation_Moderate_Ban: String { return self._s[4320]! } + public var TextFormat_AddLinkTitle: String { return self._s[4319]! } + public var ShareMenu_ShareTo: String { return self._s[4320]! } + public var Conversation_Moderate_Ban: String { return self._s[4321]! } public func Conversation_DeleteMessagesFor(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4321]!, self._r[4321]!, [_0]) + return formatWithArgumentRanges(self._s[4322]!, self._r[4322]!, [_0]) } - public var SharedMedia_ViewInChat: String { return self._s[4322]! } - public var Map_LiveLocationFor8Hours: String { return self._s[4323]! } + public var SharedMedia_ViewInChat: String { return self._s[4323]! } + public var Map_LiveLocationFor8Hours: String { return self._s[4324]! } public func PUSH_PINNED_PHOTO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4324]!, self._r[4324]!, [_1]) + return formatWithArgumentRanges(self._s[4325]!, self._r[4325]!, [_1]) } public func PUSH_PINNED_POLL(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4325]!, self._r[4325]!, [_1, _2]) + return formatWithArgumentRanges(self._s[4326]!, self._r[4326]!, [_1, _2]) } public func Map_AccurateTo(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4327]!, self._r[4327]!, [_0]) + return formatWithArgumentRanges(self._s[4328]!, self._r[4328]!, [_0]) } - public var Map_OpenInHereMaps: String { return self._s[4328]! } - public var Appearance_ReduceMotion: String { return self._s[4329]! } + public var Map_OpenInHereMaps: String { return self._s[4329]! } + public var Appearance_ReduceMotion: String { return self._s[4330]! } public func PUSH_MESSAGE_TEXT(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4330]!, self._r[4330]!, [_1, _2]) + return formatWithArgumentRanges(self._s[4331]!, self._r[4331]!, [_1, _2]) } - public var Channel_Setup_TypePublicHelp: String { return self._s[4331]! } - public var Passport_Identity_EditInternalPassport: String { return self._s[4332]! } - public var PhotoEditor_Skip: String { return self._s[4333]! } - public func PUSH_CHANNEL_MESSAGE_FWDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[0 * 6 + Int(form.rawValue)]!, _1, _2) + public var Channel_Setup_TypePublicHelp: String { return self._s[4332]! } + public var Passport_Identity_EditInternalPassport: String { return self._s[4333]! } + public var PhotoEditor_Skip: String { return self._s[4334]! } + public func LiveLocation_MenuChatsCount(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[0 * 6 + Int(form.rawValue)]!, stringValue) } - public func ForwardedVideos(_ value: Int32) -> String { + public func MessagePoll_QuizCount(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[1 * 6 + Int(form.rawValue)]!, stringValue) } - public func StickerPack_StickerCount(_ value: Int32) -> String { + public func Notifications_ExceptionMuteExpires_Minutes(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[2 * 6 + Int(form.rawValue)]!, stringValue) } - public func MessageTimer_Months(_ value: Int32) -> String { + public func OldChannels_GroupFormat(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[3 * 6 + Int(form.rawValue)]!, stringValue) } - public func ForwardedMessages(_ value: Int32) -> String { + public func MessageTimer_Weeks(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[4 * 6 + Int(form.rawValue)]!, stringValue) } - public func Forward_ConfirmMultipleFiles(_ value: Int32) -> String { + public func StickerPack_AddStickerCount(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[5 * 6 + Int(form.rawValue)]!, stringValue) } - public func Notification_GameScoreExtended(_ value: Int32) -> String { + public func Conversation_StatusOnline(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[6 * 6 + Int(form.rawValue)]!, stringValue) } - public func OldChannels_InactiveWeek(_ value: Int32) -> String { + public func OldChannels_InactiveMonth(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[7 * 6 + Int(form.rawValue)]!, stringValue) } - public func ForwardedFiles(_ value: Int32) -> String { + public func Conversation_StatusSubscribers(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[8 * 6 + Int(form.rawValue)]!, stringValue) } - public func MessageTimer_Years(_ value: Int32) -> String { + public func Call_Seconds(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[9 * 6 + Int(form.rawValue)]!, stringValue) } - public func UserCount(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[10 * 6 + Int(form.rawValue)]!, stringValue) + public func PUSH_CHANNEL_MESSAGE_VIDEOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[10 * 6 + Int(form.rawValue)]!, _1, _2) } - public func ChatListFilter_ShowMoreChats(_ value: Int32) -> String { + public func PeopleNearby_ShowMorePeople(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[11 * 6 + Int(form.rawValue)]!, stringValue) } - public func LastSeen_HoursAgo(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[12 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Conversation_StatusOnline(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[13 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MuteFor_Hours(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[14 * 6 + Int(form.rawValue)]!, stringValue) - } - public func VoiceOver_Chat_PollOptionCount(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[15 * 6 + Int(form.rawValue)]!, stringValue) - } - public func StickerPack_RemoveStickerCount(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[16 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Conversation_StatusSubscribers(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[17 * 6 + Int(form.rawValue)]!, stringValue) - } - public func AttachmentMenu_SendGif(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[18 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Media_ShareItem(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[19 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ForwardedGifs(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[20 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ChatList_DeletedChats(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[21 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ChatList_SelectedChats(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[22 * 6 + Int(form.rawValue)]!, stringValue) - } - public func OldChannels_Leave(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[23 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PollResults_ShowMore(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[24 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Chat_DeleteMessagesConfirmation(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[25 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MuteExpires_Days(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[26 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Media_ShareVideo(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[27 * 6 + Int(form.rawValue)]!, stringValue) - } - public func VoiceOver_Chat_ContactEmailCount(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[28 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ServiceMessage_GameScoreSimple(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[29 * 6 + Int(form.rawValue)]!, stringValue) - } - public func SharedMedia_Photo(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[30 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Call_Seconds(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[31 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Notifications_Exceptions(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[32 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Notification_GameScoreSelfExtended(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[33 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Passport_Scans(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[34 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessageTimer_Minutes(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[35 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Wallet_Updated_MinutesAgo(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[36 * 6 + Int(form.rawValue)]!, stringValue) - } - public func DialogList_LiveLocationChatsCount(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[37 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_MESSAGE_FWDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + public func PUSH_MESSAGES(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[38 * 6 + Int(form.rawValue)]!, _1, _2) + return String(format: self._ps[12 * 6 + Int(form.rawValue)]!, _1, _2) } - public func Media_SharePhoto(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[39 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Map_ETAMinutes(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[40 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Watch_UserInfo_Mute(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[41 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ForwardedPhotos(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[42 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Conversation_SelectedMessages(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[43 * 6 + Int(form.rawValue)]!, stringValue) - } - public func LiveLocationUpdated_MinutesAgo(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[44 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Stats_MessageForwards(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[45 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Notification_GameScoreSimple(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[46 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Notifications_ExceptionMuteExpires_Minutes(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[47 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Call_Minutes(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[48 * 6 + Int(form.rawValue)]!, stringValue) - } - public func SharedMedia_File(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[49 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ForwardedAudios(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[50 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ForwardedStickers(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[51 * 6 + Int(form.rawValue)]!, stringValue) - } - public func StickerPack_AddMaskCount(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[52 * 6 + Int(form.rawValue)]!, stringValue) + public func PUSH_CHAT_MESSAGE_PHOTOS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[13 * 6 + Int(form.rawValue)]!, _2, _1, _3) } public func MessageTimer_ShortMinutes(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[53 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[14 * 6 + Int(form.rawValue)]!, stringValue) } - public func MuteExpires_Minutes(_ value: Int32) -> String { + public func Call_ShortSeconds(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[54 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[15 * 6 + Int(form.rawValue)]!, stringValue) } - public func Watch_LastSeen_HoursAgo(_ value: Int32) -> String { + public func ServiceMessage_GameScoreExtended(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[55 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[16 * 6 + Int(form.rawValue)]!, stringValue) } - public func MessagePoll_VotedCount(_ value: Int32) -> String { + public func Passport_Scans(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[56 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[17 * 6 + Int(form.rawValue)]!, stringValue) } public func SharedMedia_Generic(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[57 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[18 * 6 + Int(form.rawValue)]!, stringValue) } - public func AttachmentMenu_SendPhoto(_ value: Int32) -> String { + public func PollResults_ShowMore(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[58 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[19 * 6 + Int(form.rawValue)]!, stringValue) } - public func StickerPack_RemoveMaskCount(_ value: Int32) -> String { + public func Notifications_Exceptions(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[59 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[20 * 6 + Int(form.rawValue)]!, stringValue) } - public func ForwardedLocations(_ value: Int32) -> String { + public func Invitation_Members(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[60 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[21 * 6 + Int(form.rawValue)]!, stringValue) } - public func Wallet_Updated_HoursAgo(_ value: Int32) -> String { + public func Wallet_Updated_MinutesAgo(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[61 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[22 * 6 + Int(form.rawValue)]!, stringValue) } - public func Notifications_ExceptionMuteExpires_Days(_ value: Int32) -> String { + public func SharedMedia_Link(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[62 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[23 * 6 + Int(form.rawValue)]!, stringValue) } - public func ServiceMessage_GameScoreSelfSimple(_ value: Int32) -> String { + public func OldChannels_Leave(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[63 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[24 * 6 + Int(form.rawValue)]!, stringValue) } - public func PUSH_CHAT_MESSAGES(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[64 * 6 + Int(form.rawValue)]!, _2, _1, _3) - } - public func MessageTimer_Weeks(_ value: Int32) -> String { + public func ServiceMessage_GameScoreSimple(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[65 * 6 + Int(form.rawValue)]!, stringValue) - } - public func OldChannels_GroupFormat(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[66 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ForwardedVideoMessages(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[67 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[25 * 6 + Int(form.rawValue)]!, stringValue) } public func Notification_GameScoreSelfSimple(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[68 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[26 * 6 + Int(form.rawValue)]!, stringValue) } - public func MessageTimer_Seconds(_ value: Int32) -> String { + public func GroupInfo_ShowMoreMembers(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[69 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[27 * 6 + Int(form.rawValue)]!, stringValue) + } + public func AttachmentMenu_SendPhoto(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[28 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Notification_GameScoreSimple(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[29 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ChatListFilter_ShowMoreChats(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[30 * 6 + Int(form.rawValue)]!, stringValue) + } + public func StickerPack_RemoveStickerCount(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[31 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Wallet_Updated_HoursAgo(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[32 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Call_ShortMinutes(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[33 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessageTimer_Months(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[34 * 6 + Int(form.rawValue)]!, stringValue) + } + public func LastSeen_MinutesAgo(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[35 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessageTimer_ShortDays(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[36 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_MESSAGE_PHOTOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[37 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func VoiceOver_Chat_PollOptionCount(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[38 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Conversation_StatusMembers(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[39 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ChatList_DeleteConfirmation(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[40 * 6 + Int(form.rawValue)]!, stringValue) + } + public func GroupInfo_ParticipantCount(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[41 * 6 + Int(form.rawValue)]!, stringValue) + } + public func VoiceOver_Chat_ContactEmailCount(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[42 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Watch_UserInfo_Mute(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[43 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Notifications_ExceptionMuteExpires_Hours(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[44 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_CHANNEL_MESSAGE_FWDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[45 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func QuickSend_Photos(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[46 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Chat_DeleteMessagesConfirmation(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[47 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Stats_MessageViews(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[48 * 6 + Int(form.rawValue)]!, stringValue) + } + public func OldChannels_InactiveYear(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[49 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessagePoll_VotedCount(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[50 * 6 + Int(form.rawValue)]!, stringValue) + } + public func AttachmentMenu_SendGif(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[51 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Conversation_SelectedMessages(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[52 * 6 + Int(form.rawValue)]!, stringValue) + } + public func CreatePoll_AddMoreOptions(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[53 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MuteExpires_Hours(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[54 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessageTimer_ShortSeconds(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[55 * 6 + Int(form.rawValue)]!, stringValue) + } + public func VoiceOver_Chat_ContactPhoneNumberCount(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[56 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ForwardedVideoMessages(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[57 * 6 + Int(form.rawValue)]!, stringValue) + } + public func InstantPage_Views(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[58 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Call_Minutes(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[59 * 6 + Int(form.rawValue)]!, stringValue) } public func AttachmentMenu_SendItem(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[60 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Contacts_ImportersCount(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[61 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_MESSAGE_FWDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[62 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func PUSH_CHAT_MESSAGE_VIDEOS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[63 * 6 + Int(form.rawValue)]!, _2, _1, _3) + } + public func ForwardedFiles(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[64 * 6 + Int(form.rawValue)]!, stringValue) + } + public func InviteText_ContactsCountText(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[65 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Theme_UsersCount(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[66 * 6 + Int(form.rawValue)]!, stringValue) + } + public func SharedMedia_File(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[67 * 6 + Int(form.rawValue)]!, stringValue) + } + public func StickerPack_StickerCount(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[68 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_CHAT_MESSAGE_FWDS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[69 * 6 + Int(form.rawValue)]!, _2, _1, _3) + } + public func MessageTimer_Hours(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[70 * 6 + Int(form.rawValue)]!, stringValue) } - public func PUSH_MESSAGE_PHOTOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + public func PUSH_CHAT_MESSAGES(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[71 * 6 + Int(form.rawValue)]!, _1, _2) + return String(format: self._ps[71 * 6 + Int(form.rawValue)]!, _2, _1, _3) } - public func GroupInfo_ShowMoreMembers(_ value: Int32) -> String { + public func MessageTimer_Days(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[72 * 6 + Int(form.rawValue)]!, stringValue) @@ -5203,203 +5199,208 @@ public final class PresentationStrings: Equatable { let form = getPluralizationForm(self.lc, selector) return String(format: self._ps[73 * 6 + Int(form.rawValue)]!, _1, _2) } - public func InstantPage_Views(_ value: Int32) -> String { + public func ForwardedLocations(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[74 * 6 + Int(form.rawValue)]!, stringValue) } - public func PUSH_CHAT_MESSAGE_VIDEOS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[75 * 6 + Int(form.rawValue)]!, _2, _1, _3) + public func StickerPack_AddMaskCount(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[75 * 6 + Int(form.rawValue)]!, stringValue) } - public func ServiceMessage_GameScoreSelfExtended(_ value: Int32) -> String { + public func Media_ShareVideo(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[76 * 6 + Int(form.rawValue)]!, stringValue) } - public func Conversation_StatusMembers(_ value: Int32) -> String { + public func Map_ETAMinutes(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[77 * 6 + Int(form.rawValue)]!, stringValue) } - public func PUSH_CHANNEL_MESSAGE_VIDEOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[78 * 6 + Int(form.rawValue)]!, _1, _2) + public func ForwardedMessages(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[78 * 6 + Int(form.rawValue)]!, stringValue) } - public func StickerPack_AddStickerCount(_ value: Int32) -> String { + public func DialogList_LiveLocationChatsCount(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[79 * 6 + Int(form.rawValue)]!, stringValue) } - public func Wallpaper_DeleteConfirmation(_ value: Int32) -> String { + public func ForwardedGifs(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[80 * 6 + Int(form.rawValue)]!, stringValue) } - public func SharedMedia_Video(_ value: Int32) -> String { + public func ForwardedPolls(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[81 * 6 + Int(form.rawValue)]!, stringValue) } - public func PUSH_CHAT_MESSAGE_ROUNDS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[82 * 6 + Int(form.rawValue)]!, _2, _1, _3) - } - public func PUSH_MESSAGES(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[83 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func Contacts_ImportersCount(_ value: Int32) -> String { + public func Notification_GameScoreExtended(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[84 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[82 * 6 + Int(form.rawValue)]!, stringValue) } - public func MessageTimer_ShortSeconds(_ value: Int32) -> String { + public func ForwardedVideos(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[85 * 6 + Int(form.rawValue)]!, stringValue) - } - public func OldChannels_InactiveYear(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[86 * 6 + Int(form.rawValue)]!, stringValue) - } - public func LastSeen_MinutesAgo(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[87 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Notifications_ExceptionMuteExpires_Hours(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[88 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ForwardedContacts(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[89 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[83 * 6 + Int(form.rawValue)]!, stringValue) } public func ForwardedDices(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[90 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessageTimer_ShortWeeks(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[91 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ChatList_DeleteConfirmation(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[92 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_CHANNEL_MESSAGE_PHOTOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[93 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func MessageTimer_ShortHours(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[94 * 6 + Int(form.rawValue)]!, stringValue) - } - public func CreatePoll_AddMoreOptions(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[95 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[84 * 6 + Int(form.rawValue)]!, stringValue) } public func PasscodeSettings_FailedAttempts(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[96 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[85 * 6 + Int(form.rawValue)]!, stringValue) } - public func ForwardedAuthorsOthers(_ selector: Int32, _ _0: String, _ _1: String) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[97 * 6 + Int(form.rawValue)]!, _0, _1) - } - public func Call_ShortMinutes(_ value: Int32) -> String { + public func Notifications_ExceptionMuteExpires_Days(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[98 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Call_ShortSeconds(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[99 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PeopleNearby_ShowMorePeople(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[100 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_CHANNEL_MESSAGES(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[101 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func PUSH_CHAT_MESSAGE_PHOTOS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[102 * 6 + Int(form.rawValue)]!, _2, _1, _3) - } - public func MessageTimer_Hours(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[103 * 6 + Int(form.rawValue)]!, stringValue) - } - public func LiveLocation_MenuChatsCount(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[104 * 6 + Int(form.rawValue)]!, stringValue) - } - public func SharedMedia_DeleteItemsConfirmation(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[105 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_CHANNEL_MESSAGE_ROUNDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[106 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func MuteExpires_Hours(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[107 * 6 + Int(form.rawValue)]!, stringValue) - } - public func GroupInfo_ParticipantCount(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[108 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Map_ETAHours(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[109 * 6 + Int(form.rawValue)]!, stringValue) - } - public func SharedMedia_Link(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[110 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Contacts_InviteContacts(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[111 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[86 * 6 + Int(form.rawValue)]!, stringValue) } public func Conversation_LiveLocationMembersCount(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[87 * 6 + Int(form.rawValue)]!, stringValue) + } + public func SharedMedia_DeleteItemsConfirmation(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[88 * 6 + Int(form.rawValue)]!, stringValue) + } + public func StickerPack_RemoveMaskCount(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[89 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ChatList_SelectedChats(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[90 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_CHANNEL_MESSAGE_ROUNDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[91 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func ServiceMessage_GameScoreSelfSimple(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[92 * 6 + Int(form.rawValue)]!, stringValue) + } + public func UserCount(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[93 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ForwardedStickers(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[94 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessageTimer_Minutes(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[95 * 6 + Int(form.rawValue)]!, stringValue) + } + public func LiveLocationUpdated_MinutesAgo(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[96 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ForwardedAudios(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[97 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessageTimer_Years(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[98 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ForwardedPhotos(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[99 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_CHANNEL_MESSAGE_PHOTOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[100 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func MuteFor_Days(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[101 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_CHANNEL_MESSAGES(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[102 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func AttachmentMenu_SendVideo(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[103 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Watch_LastSeen_MinutesAgo(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[104 * 6 + Int(form.rawValue)]!, stringValue) + } + public func SharedMedia_Video(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[105 * 6 + Int(form.rawValue)]!, stringValue) + } + public func OldChannels_InactiveWeek(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[106 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Contacts_InviteContacts(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[107 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessageTimer_ShortHours(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[108 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Stats_MessageForwards(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[109 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ServiceMessage_GameScoreSelfExtended(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[110 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_CHAT_MESSAGE_ROUNDS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[111 * 6 + Int(form.rawValue)]!, _2, _1, _3) + } + public func PrivacyLastSeenSettings_AddUsers(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[112 * 6 + Int(form.rawValue)]!, stringValue) } - public func QuickSend_Photos(_ value: Int32) -> String { + public func Notification_GameScoreSelfExtended(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[113 * 6 + Int(form.rawValue)]!, stringValue) } - public func ForwardedPolls(_ value: Int32) -> String { + public func MessageTimer_ShortWeeks(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[114 * 6 + Int(form.rawValue)]!, stringValue) } - public func AttachmentMenu_SendVideo(_ value: Int32) -> String { + public func MessageTimer_Seconds(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[115 * 6 + Int(form.rawValue)]!, stringValue) @@ -5408,76 +5409,76 @@ public final class PresentationStrings: Equatable { let form = getPluralizationForm(self.lc, selector) return String(format: self._ps[116 * 6 + Int(form.rawValue)]!, _1, _2) } - public func Stats_MessageViews(_ value: Int32) -> String { + public func Forward_ConfirmMultipleFiles(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[117 * 6 + Int(form.rawValue)]!, stringValue) } - public func InviteText_ContactsCountText(_ value: Int32) -> String { + public func Media_ShareItem(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[118 * 6 + Int(form.rawValue)]!, stringValue) } - public func MessageTimer_ShortDays(_ value: Int32) -> String { + public func SharedMedia_Photo(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[119 * 6 + Int(form.rawValue)]!, stringValue) } - public func VoiceOver_Chat_PollVotes(_ value: Int32) -> String { + public func Media_SharePhoto(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[120 * 6 + Int(form.rawValue)]!, stringValue) } - public func PUSH_CHAT_MESSAGE_FWDS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[121 * 6 + Int(form.rawValue)]!, _2, _1, _3) + public func LastSeen_HoursAgo(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[121 * 6 + Int(form.rawValue)]!, stringValue) } - public func VoiceOver_Chat_ContactPhoneNumberCount(_ value: Int32) -> String { + public func ForwardedContacts(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[122 * 6 + Int(form.rawValue)]!, stringValue) } - public func MessagePoll_QuizCount(_ value: Int32) -> String { + public func MuteExpires_Minutes(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[123 * 6 + Int(form.rawValue)]!, stringValue) } - public func ServiceMessage_GameScoreExtended(_ value: Int32) -> String { + public func MuteFor_Hours(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[124 * 6 + Int(form.rawValue)]!, stringValue) } - public func Invitation_Members(_ value: Int32) -> String { + public func MuteExpires_Days(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[125 * 6 + Int(form.rawValue)]!, stringValue) } - public func MuteFor_Days(_ value: Int32) -> String { + public func Watch_LastSeen_HoursAgo(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[126 * 6 + Int(form.rawValue)]!, stringValue) } - public func Theme_UsersCount(_ value: Int32) -> String { + public func Wallpaper_DeleteConfirmation(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[127 * 6 + Int(form.rawValue)]!, stringValue) } - public func OldChannels_InactiveMonth(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[128 * 6 + Int(form.rawValue)]!, stringValue) + public func ForwardedAuthorsOthers(_ selector: Int32, _ _0: String, _ _1: String) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[128 * 6 + Int(form.rawValue)]!, _0, _1) } - public func PrivacyLastSeenSettings_AddUsers(_ value: Int32) -> String { + public func VoiceOver_Chat_PollVotes(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[129 * 6 + Int(form.rawValue)]!, stringValue) } - public func Watch_LastSeen_MinutesAgo(_ value: Int32) -> String { + public func ChatList_DeletedChats(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[130 * 6 + Int(form.rawValue)]!, stringValue) } - public func MessageTimer_Days(_ value: Int32) -> String { + public func Map_ETAHours(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[131 * 6 + Int(form.rawValue)]!, stringValue) diff --git a/submodules/TelegramUI/Resources/PresentationStrings.mapping b/submodules/TelegramUI/Resources/PresentationStrings.mapping index 74c9b9e42f6655a5d59abd87d096cf0053998665..9522e88eac01f2a96715636a59e33d7bd019cdb9 100644 GIT binary patch delta 18357 zcmZWx2Y6IP*UpS=+HSI&UUpM99SEC*j?@65NJ$_R8)Z!v2qf8%Y$%E}J0R@}uZ60p zpwd)CI@pn}ph!nW5vlrNL4p6ByPJT||2*h2GiT1soH>2YW%it)jdOxTw`pR75IaU@ zB>4IHb#pmAwbicDVozDg7*}cK%Ty^b&C=-cMA8}3~n>xmV%2GA-F`Acg=}+)*nXrpb zF}Y0SiqEi?@ZxjqFB3`P3tTP}$znImqeXMWmqe0|kWd+m;iE;Q*n`^9B310gOQVHV z?8Ao9B1P=S(a}V30Dq1aNw!0rVpi*Nug(%r&&m;Q$9?Wc)bd}U=@^k__?i%QZQh0m zRNW9EA)U)>U260&yTh^5B_e~XRQm|qaoVk8G1xXn1c`6(`54hgd<#)7?1rNpOv1EI z!fN6|Bg(2P)Rgbgw_G^HG3*>7I%>}kGRot@SpBE41`Tjc&E3?j5v$M6(rL4*ij)Gi63x*EyItTkfw#5jKKB;5o+vS z?XIn=Q7fNAyGqf}@H5A4xOhs$8GE>#rLJlhKo7|_aPB$>f@@ZagNk!a|so0Ud~lK?-rSX*9a3y#M7Q;Vm zrfT+sRzmY;_v`so@?&5$q931~Ypb zX}KM2xX&Y^gayMrB3*_VF?Xkk#Zr$56yaFu5qTmK$2`3LC|GKF{n4D4rJd0tG32HQ z&>DwF8e-TLtL1(j)3}GLTxY{r_K*gYqmofBM_q3mdt=zEa{$gR6VWo>s9kFxi&M42 zKgG)7Fb)r0S(ys!xe;wSLFa&Yei-g_P%m>`m6Q=^vCDJHsSWr@3j=!!?Vt93zZMikMS zsaKpoar-qlYKQhkYHORMh!(gtK{#YWpQNia1e#&5w$Pq8omElq#k>(Islr zzOiBNW$KPTX!aNf`(nsr+;Sn8j*P(k$2hGY-g!*q$o}k_nuvcMqu>uf#3Yd-2O7~S zOT?h>B$9FvhE5WhNrQ$-}TdE|TOBqc*f6I=rjX<1BW0JfxJaHijCtgX?1O*yAEPbr_LH5sl7Lj-uK} z%F9Z6msO4-_l$6}-*324n|d}WI8UwRByc7w*ND`GlPM*Sz%-f4u>{>FQ?Ohpo6Mz0 zV9sQbEk-FmiqS5m1sW8VGMt%AO+FgeCyP`$Mlo$%z@uuU+^7wUjzZxSGG7ITPZ4>t zQs?Oc&lolC=9nTW*D*?C z;8bBUR1+=>6$6A7&8Lb;Lk-(WI#Wj!yKAdUT=x|h_9Y%a4+j#I_A&N%`Ix=dsExg7 z4eea*9{kw zJ9R_9fb*38@m`gFORh>!afQxw3o-UdktxCJ-WKQIOl|f>YTsO+Z*<5gVecf#OazdogA|Mfxn^s2$g?Qp@gpinqFy?M7HO zUBuzGn!SweSj@gpLCg>{@EE@S6hp7|=y5LR9@ zYICadLI;(Vx^yG*8-eNarpPD^nJ0{f-`TcmXIn;K>O4-qj=A%AX@B5@d5i-7#JBTA zj^S^80sF{kbAMNjhv)LRbS-lOx$}iR;a?70^wT>%y~}Dmj{bCg^SxT|CMxF>(JjoG zPb=tW!n*nNX@p7LU07NqF3#to693NU_1uFPjaI$^`e@w00Tmjr*`J`9+SrY$%1xll z__@aULF|mcyvrgYsE<>3fr3ri#feF1^nx%+qyG1>{L<2DdeHjinK;3!HA#xa)EDSv zhp_3;?9Jk^@&#c_4P{fAb)~wyxm=}>I7`Odk&iHrW@)+2V{!Wh5n~8fb1@Gh0j(F% zy^27;1r)$YljaPI!0ZJggqmW}0+C>dCS)?krcft*wLnA|V%W~mrp4N{wF3+=F635Y zO~`&!#A8{O^v8j=BGA~4GSpM2ZX9|q6uC0qq~-LA3N0>iR`#qcbxlw#WySJ^bn|UE zu#ieDfq3JwC&o_I<5m?rERBC^pWKt^hgTS10q#1f}nOO7%X*Xp`Qp>B?fmnj@A zI2MlsEqTy&FH?87G->^6V>O2sgp)6Gg;u!mGWB+A1iiwady(}D%|Tlfs#ZHxs-O0F z{uR=zqeHIgu}0h6hl6jh|vyBW*D(Z1j)|i>K?r0GfxWx?V=v` z>V~!p@)t1>>1smz6h_cf7g2-@FmsWx8oDVInAeumcCg#fo$c0oAofak5odCAsjcz2 z^_aE?LKll{!+qWfWcj;wd@l@LO!4ZCDT`^d`kFB0U!HsGVv@FyS8|9f^7~>D5nsgF z%1fzFAlz45sq4&sNM1sE_eZZK40elAv4p%lK7?W)*tFm5d&d)*KFQhGWMV8Bx1co5^%&qH`|DZTTDu~q#H!I`BDPlv*?j0`)R zyGhY48u~9I!#FW&8H2k=*lma95AxB9WgVv&WJuad(&CR}<(r1(Z^vGY}` zuW>l@DurM?{(V(s872^&vVJxcyv9&*l1VvL>Cw8~ud|eHJ0FbCb`Z;p@EL877=QP2vxKooa3-=jEuK%zItf z+s!F?~_pf|wL^EeAlDqKY3W5TE{{>Btk=l%iN zZ}QA9qUcSU@0U>dCOztx@$8#S3oIfEt1^?u2VCXl?(quy5*&DwUg0thHPOY*xKhL! zmb2N|NA?8qDjr@*Zh8&RtQ6U{6&zD8c)e}c10RL!b*iNhX$>v&xV^&kCPD33A4FPP zRxyZL1^X&tmv5U?+!oMMUGO_5j5W#l?EG4aHyx`Ig=h`uDf?5OK#%PXceNgWtzrc6E|TA3koq1ODNb53>@5)}-!~yYNJMB$ZN@+nRAJtLId735 zA7a&8R63iuPKG+Qwyh)xm)>GzyxGggNpDj%Z9${ADFIt?aQ)pb`Zkom&4qUWYIG+y zy-kVRg%fWxKK#g}RZX`BchB!rpicL(3GSOB$6vR(pP=j=ku5(p>7Fpwyh9fKOxYzp z7R9l5M2O*Y?x-P(7BUbFSWQjv1rk<^thn9m<{v*_2Fy{HIQkMpS2K&V2Xj}`{O!f| z)l@3`aCtS8T?de~hN|!&I;~;6bqJ%^h{lGmh{dMO^F(9a8XD%Wv7Hff!eRC*#X`^9 zr>^ht>k-^qqkKe@?wGY-E20fY6%x!V;I&q*rPKDENxS+>3|?5v)ZH=D!VIeRId&0@ z18bQ&IZogx%~=tFD{D#LQ}}x=cYGR+*HQ7E;h6StQ5mm$*1F#Li6d(3T}C-Q`K8Rb+~vrhN6vau;1?9FC&mk?T2EK$ zSG6Cnzqfk52(VpbTZw8HdhFFs%CWO%RN;sb?D4y#EsKJ+ptzsG>>Z@l@QXqOxPj7UK(`HKBY#wFU|bv!qUDF%uxSGw=0Mufbd{38j~hgo zHHb}hRYlISN{^$k)>B?q>6P1HSUw;*jmZ6g`piT)x-4^Ig9c2j(oJtD9{Yd}uDK3h zbQfo3iL1QWo0n4;V&PDvHtp#c-E|6M%clK0!&>j9% zOiX5mXwK{i^f8HW{SF$1;LthlsL^H-oYt6=m1$8Ntw#^u3s+4=gKQ2bV4j=l&pMso z1dnefgF3KeGmTdcHg6WKWnPG~ECDs;YEm;qY@to0 z23uj>7MhIK*uO=jcWgr##dW@ft?v@V*+u0F2PGN)RvE!Ka| zEa|YVRI=>|8INflWVBZFfxo}bvmLN}E2W`hh*mWv20w1)wRD2mM!!0r(2Z40fYnda zD<86rTBB2aIwtGcd5SrnXA?4PMC@#zB=x9PIRzjOy>Ia5L)2FLzaY>V2)@xV1~zwR=Ae z)>;1%PO#zebHWzrd&eok(ytj%w^CN86vuaQWtW2cHr3^JDQCK}i&N$KyD_IQ&YMRm$JLK0D-}rim|CU^ ztv@FBjK#xj*{eBIspGC?&T{uiFZ(J@#V)@Zj-{(~VT!S5X`Qa};FFIjjpOjk$K2$2 z7(bzJKY@_hdN?}p6D~0kRiDtrKZ+MWp$VJB!BkW}BvLxo3BY7_DUqpX#?G}K`XF_A zkSQEyNUjo074Aw$SD#EyMZ-_I<}~zDKhsh1skqnh1Yxu0k6{EhC8E9B^^?BIck-t# zRQFTtR!OUR`S9kj?+D1#i2RH`{4<10#mo^(HGD>&2^@0+@9%2D*d`^yCNK~1~n<&y%#3+ElUy$xEVbT{=9WP_?7ko%qghO92 z@v<1_IVP8cpsFF&W!i4OlP%@+bjA?LcxX5MmgVSln6cE8ySeyly5+#O-E^5&;EUZn z&g;0iTQo7e!AaRVTQ&VsBxS5(Q_*aYo0*_Oa+4$9!za;E^=jiS0x+}C!HW4`GGF>O zo4(Y{&M%q%ddI6(avBP&Tpgk^)SCM})1BPu8g$&laAz&2wSVF;H*h8hf zp4~}Ul0iLtW)IEwySTcCk?wnl*-OLrKJxcc*f(O>Uhe-xJi#BsCQeDz7dX0~huMuk_ETWKcbs5in*!C5Z-ya>|_3S5X9L^?+Xw#jy-2)+7&W~|g?~^87 zQ5_^qvPxh__Hj<=R#xsRE_+lz_#qBtdP4*EK`QjG*iOap*0jB^ALQ+PjSUCs&woQJ z)`LNtHDafBBAZ`^l;5`2T8zSuxJ!r0&+ ztUAIa|HYRCk~c&2m$O?(NX%P=OvdsrM54VuBvnq?T}rU8&u&QE{|$}RJ(%_lb9W8! z@;4-sKX!aWHVVXrZ@5z6P-6;WPXM@>Tl^tSg`h6k!lO$ zkRJSc%Rh=#^3WH4h2ye96@k#BOvOfqA~%=Zq+=L745$xliLWBsK3NCE*|BqcGW$_B(PuEU0*1vZ$<}D zmzIciM3ItvS)hNG(s2k=mg5NfPv4Jbsdkx5cuP^vBv^+e!Mn z?FmcoEr)k;vn#Kp18$w9Sad|*DSAVlFyxeIXUHc|2H((a*nEl#w=?#hBHMPs`BUVS zt{jZPln;nZ(X$(xoaV;5AdPV%y_relCl(QLU-N`Td((=PX=g*19?(Z2l4JSxA z@~<&*rRd_s@82_(`UrcOk~ooy_CGL{RuZa(8m-#Y@dlLrK)dV0xF5(aBY+>M;74M^ z4;0=}IQ4^QW+>y-OxOaXZs851bxg{WcKygp8H4dZk`pSh=tmy13R`|8p0PObBgt9= z<2j0w2Tjhgvle~NQToSY;yIP6BbpQ(TE!4)$2ppqi8y$Uiuut{*!xhB1Ae05KZfX^ znAdqcR6F!lGz!@jJ(<%~wN+=g$5HHY>p9A)p$iVkM9lk1M9FEP+SQ*Tu{~XyGD%?d zFrlb0ozs-=@aARp;)(ley+s{Q;L1;;BeQuqKT~r*#kHP|#g#`$Nj33VO#7Kzn8AB^ zk@o3lMy@k);%8>@W`$ze*CN(mFB5nk*7HHfLrIuMGIj6g)#;L)$2zSDt=*d=SB9} z^;aJ47ixf)u<{o&+RNyM=M?3E z)Nf4R*Q0&np(Y`wq`eFcx*jE`EkF7VP`hxu1}MsILljLI&>>&E#_HXEvfGA;E$ zSWxkpGX0iTV%D$ZkX3m5S4QJ+5hhtBYE8;_aE#04vVL#l)~}*H{jqiz8E&s8NE21Q zrk$}cBmTY!Ff*ISx|hDb@}@P=E|Tc$u<;_D!u14CP&yK~FOqlOMd&5kg7-r8VxhuI z!r$;dA-pes<1f((-oR!ga^GYezw{EHNk8!F4E>G&E}gM4R68?05rv&u8+DWO=){Fw z=7nrU?qv%3b_}`9XlMtXzs$Yt#QMvWhF$pPG9M&93dNPxjNucmaN5Uca)l6|px+g$ ztWUYPFDKiDO3G8Mzpj0bxmV~reu0fwXrFcy#tyqGqx$CxmDQIpU**Dk(DW*azL%q^ z-i*P7tK@=xY+F^nB(SryQc-h1R$ryq9l-vpr29c!y2=8auXK6@l<87&811hS;Smg{ zw&-${2rQhZUgsRT1H#~pxl_fP-*HSuk^?JC-E>Y>_L*UW$D2aXL%n1A^4I1>V9zxY z_c)soIBS##&{DO`c@C%XmqlCJyzwy+ zd}mal&A|S>+3EKSN3*=863c$4j9pM>Cjp0lr?&i+V|HbdA|U?94PErIPVWDNzr3Wo z6d4%Gf%Gc`RL-n=FHt(EciA{sZ?|_RYLROkw`nsgtsyGCp?ZE}Pn43-;JSyy--*0K zTyW3Is#-mW{R84U_wy%Wuk*70LaXb%n7{Ghb#l`UOu0_g^p9=}u=6@!4gMvlIJKZz*7?0uW6FUAVSJAZPIMjZN+fu@N{ zHbz@NG|pdVn-GNlMXaG_y}o3?Uo>oH?7T;KR%+f$!f` zZ7v+A{-T+PAV{Lt?)QYCezj$K^;8t{{-zfm&4DPW`b}Nu#ITv9jZNWu|KG$EYersY zUD<_1)xD+D%<5bpr>|;foxs8yq@5LEHyD%I*h_)TC6W5x;6q^o+X;2Wvtjfmr{AD? zN-|@8l8nHn8^UZ&CI~%ZUrMsSYh-P?vs#_YZpN-6krc|6UHa{&5K<*2BSQb^4j%9rH*0-N) z*3PzyLhwx%#pDr1ik>%Xb(2b_DVqs;Siwq83%$Y0o1%rGIeVGuJVQ;oRZVK4uRC=@ zJbu1O7ojEozDaIw1=}rhN^9ibq8rc#<+rFl@5M{EsPWok=Pmkl9n{47%C87RCxy7K z3^)L}w^=Whk5;z{+L=RCcRN|!e4E;}3#Q&C@~(LOHk0WEW^JcEvLU6fj(*(;u83Pu zTIOMZH-aJKot#RK1s0h`U(g&PleFBo0~b6jjk1>+GtI*4ElTNa*0Y}8>+Q4PEtx9% zF4!-d+Y5>JE>rJ~Z%gZw-Tg>P7Q7Wb#Gt2xkRi9)Yz18??QzMj!C((;MbB}ByN13&-EwS3tvj$ma zR)JXtPM1($3~L~R4Wo(1QFp;Xn9)GSC6DoKqllS7K6N-$1>9Y(Tsb~&Ae+$Pyw*Tw ziAuy9WRjtZb7GO(mE|EyBm0VC#$u>Jrif}xGss5tM&B{WtauMWmDK9mo5_gs@-lDE zq!yPAWP@>t@RvD;@dQi8_Orrf>RCC?Sze|q@(FPJ%Z7%D9AsUMO;3|5ZS^R2`O9>} zW9(0-=aU9=fD9Cq5E~%#Sm}6Q01;1C>NdqNg)o`g@K@8YIe-+H#%8MWo$Pml{^|H% zfXw7Ovn^0Ir)SzPP{xU;F(#0m&p-?0xu3<>Kr-QTI1?z-5@ryI?>1P>>eU=|UeZj( z1I-Mx2ojC_NXlqMkPI@+W;<3ryzA<74qMhbZ5No{)m!W{m%ZK~S5ga=AkEl{r z*2vwF>qXdZl!?qco;1paa*5gd?4D?nF@~j_#_FPxBGWvuN>y{Jx*wwPTZSr=%rY$J zcs$l$6;UDdU-hK98hs5rOtLZk-d|0m{u@eTG!-k+IfQJs3NHS%d7Cq7opt^yta7oK zh@7Syo_9E+zir$VclRwEP;mbMMVmF)8A7>Si=Py-bqEUO-LFT7P}!Qv#POjrnaRW# zL#5rYfp{`>@=d->Pxk{{4CQ7v!eW*g@c!NQyU7z-`j_a_{T_0~}wv`8bfiYF{Gp5E@C7OIQghzTRm9sa7?!1amlv`xRP*^ZLGqGn`8JFd2g0CKiR036EfHIJf#O_Jzw9EK|HELOK$@<7W8B zPk(Mzro&xL?^oZ@F*B=rqwYjfCr}X~6AY&ao~l>Yz8N9I4QJS7RT#Y#d=nwfhO=y2 zarS>AdSN8B`}YWmlr7SJV6QSFy0m!JuKwoCs$zBaA35AeuRDA!QrhG>Go~eo3hHIH z6Ok7v;_rTlxyoMU?CZV?(BpFjl4-f+WZ;l}8cAfxHD3{IdDXoB$x+_eLX6KLaeuqT0PFBcaRWTGLD zSgiW(N04KRYfDOe$(^Pg$VPq~_x3=dw8&-_rqM*KvDj5UqD*&_nqzh%m3j*TrmDjD z6r4N|Fv{E@vchZygkoQ<= z)t#5hrfSUr*posfI?$r48ME4o*W9VWL9nEfEQ2{U$@`^3ajFcDzn^WTFjQhpuaU3Q zrVnCDDkbzG3e(g?ERCfw9Z2OKAI6zfvc-^vX)?|*jI%S;Jtv@T8t-|yMVtFZ0>6>b z6|$3~>J`wJy3ya5dOII+m8-w0Jw4(BsLR58zpU}qy(oZE0{p)KtWT}iJ9Obt8U<;j zMLRS)2Epkvg89+JblHYq_}rgPI*!5Abn;lazDavqZt}}?o}dE9(@D}w+)kH`qum@; z4wuiy_I0autI#Qf4&GQin87=!#)J$`sKKHPnJYZlmqATgYtbWP{TY57?3rA4JRZuF zHZcJcGATwAu{@KTcnrHUDJqk=Ogy8u$c0&qIUYx77MX6cMUO@Dv*=V!A%I>P8mnzR z8G@-<)UH$6m*g$zVVSg<57_Inh;llPW^tV-aXpLi!c#t-)wH3EuszKg)V}@D*hM7c?isdm>>MY%e zHq2r>QJa?)&zj@<51yV^dYIqPDAcpzY$WfKb1Yh?!?F0Zk&H0R;`=iZ>DHpue<|h;#M#cU+mk;pSvEI7j`qak|or^)lV9%vD}m z@Ahrya3;U-v7si9rg;aR&ZCas$=*1hbTkO!bGz<$@Qa*0UdhL}na7L#lrR=dQ!%<) z=QB0M8+G()Dp^m-woQFK8)>OfF6y0!>M!s_Q+isv36P+kc|!T2U8SCx{E}Ts+WOH^ z+V+7#LHt5dPmAust)|rTdy&?RTid6@_@3k=4ExzkR$s6tt7NI7#{n#DMs_=h&lLC} zjbJ;NNYxdstBuoEISCEG->eEP75j(1wma{G$c7)JMi2w66;`N%p z!R+R;gYt=+)Av4#^UcX{-w{4VXE?pa?3hJ;Cdk;;<&7dvU}y{O;Uu9{!ous)st+D& zbt<32vKA!IX$~_l(I5(ETF{X@g9|OlUuO}}lG@^XucGSIQbsWoJcw_jh93zZr`uA@ zX-SoK4vSlI!cW-TQd+I&Ia(KT@tc12C6#M{TaoJ*Ty066dI6!W=)3%iyjGlb5q(>c zUoTm(O9=H%gaI$KqCUTjm91nda=KD+2~6uoHju=jzIcwu1MLZM51#Hw*QEiHWTlX}Te0d9>7Kb5@P?b`F7IdJh?Bh{@-BF!Zem$l^#`BhD4RYI&V zFdmy&mT+nhh2^Ebd{T|0w~O@^aY$%OLlWFQs7uwhbb85dAoR#8>%O2qBfAYd)(D3u7|bjz_09GCI(A+$?P9%$skB54w^$8*w~YRT~?9-|F%`r!gLH$5pdA zq$-be{xJpg;K#BxP5e|Xx1rnMuEh=%6)9jO`VjCY?KKYDyR+qX;^$*#6i`4K5zmtrOYfGSdCid}RJNEI~S%zuo>2X!G z$JTrrl@9C;L!L!O+*909XX3<|PV7@0S-*tt{pREA0+|}unFEyKx;jRtaccB^bx|A@ zBf2hZEt6z{pZ+fmq$<*NBd{WtZ;J!UnBt&;CVjiB5mkvD8CTqce^*@iA1G$GFr2K0 zkGX5n3%lD>;Ctiby)q`Z4}t4cNx^`8-y!?@(A00ejxdD?X(zL?i#V?Q+WK*2RQmZ) z)psgKw5C5Mw3g|y#T-;3TtBGOyJi5UcBW@C&<`vl;Nunl%>Y*^tJz!(ziS2&KC_;g zXh9~{3}#olHax%<;^R!6X!oPAD-)g%U~va>>4WHXFLmHU)HXJw{!LNw!))4k7Ev15a9m`OxYfpX|hJ$SxLl4K{b~3%ElMw&exBgsOqvGiQcN>abYt)Aq z|Cyi*c1@|;O_KhKRIEZ6#a7DICOsVLU?bS(H!%e){VyJ=G(r;H?SWLVq70S!+}3C% z5=qJG9Vv$Y)qM`e>zhmRNzKCYV%40vVfb%4&kv2CV2Qj;3{={l`NL! zOMezHH0e&KcP!?%rKeM^uzQup+RoBIr<}Bi#O;nU0E@XN3~nux^TrWM9nqU9(N(Jw z1r^jO-n(1Z>W80z!geyInR@Y65lF8AcKpA!rr^GOnVLM65K61mFX?@0uhIX7 hotkNW-q*v%-Ds<)!*Q>)MLt1j{nF?cQ&99h{2vB7_VNG# delta 18435 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 AuK)l5 diff --git a/submodules/TelegramUI/Sources/ChatMediaInputNode.swift b/submodules/TelegramUI/Sources/ChatMediaInputNode.swift index f0bf594d35..6cf9c17d20 100644 --- a/submodules/TelegramUI/Sources/ChatMediaInputNode.swift +++ b/submodules/TelegramUI/Sources/ChatMediaInputNode.swift @@ -809,10 +809,16 @@ final class ChatMediaInputNode: ChatInputNode { var gridEntries = chatMediaInputGridEntries(view: view, savedStickers: savedStickers, recentStickers: recentStickers, peerSpecificPack: peerSpecificPack.0, canInstallPeerSpecificPack: peerSpecificPack.1, strings: strings, theme: theme) if view.higher == nil { + var hasTopSeparator = true + if gridEntries.count == 1, case .search = gridEntries[0] { + hasTopSeparator = false + } + var index = 0 for item in trendingPacks { if !installedPacks.contains(item.info.id) { - gridEntries.append(.trending(TrendingPanePackEntry(index: index, info: item.info, theme: theme, strings: strings, topItems: item.topItems, installed: installedPacks.contains(item.info.id), unread: item.unread, topSeparator: true))) + gridEntries.append(.trending(TrendingPanePackEntry(index: index, info: item.info, theme: theme, strings: strings, topItems: item.topItems, installed: installedPacks.contains(item.info.id), unread: item.unread, topSeparator: hasTopSeparator))) + hasTopSeparator = true index += 1 } } diff --git a/submodules/TelegramUI/Sources/ChatMediaInputTrendingPane.swift b/submodules/TelegramUI/Sources/ChatMediaInputTrendingPane.swift index 6e088dfed0..4a3c664cf5 100644 --- a/submodules/TelegramUI/Sources/ChatMediaInputTrendingPane.swift +++ b/submodules/TelegramUI/Sources/ChatMediaInputTrendingPane.swift @@ -88,7 +88,7 @@ final class TrendingPanePackEntry: Identifiable, Comparable { func item(account: Account, interaction: TrendingPaneInteraction, grid: Bool) -> GridItem { let info = self.info - return StickerPaneSearchGlobalItem(account: account, theme: self.theme, strings: self.strings, listAppearance: false, info: self.info, topItems: self.topItems, grid: grid, topSeparator: self.topSeparator, installed: self.installed, unread: self.unread, open: { + return StickerPaneSearchGlobalItem(account: account, theme: self.theme, strings: self.strings, listAppearance: false, info: self.info, topItems: self.topItems, grid: grid, topSeparator: self.topSeparator, regularInsets: false, installed: self.installed, unread: self.unread, open: { interaction.openPack(info) }, install: { interaction.installPack(info) diff --git a/submodules/TelegramUI/Sources/FeaturedStickersScreen.swift b/submodules/TelegramUI/Sources/FeaturedStickersScreen.swift index 1bb6218922..8488254b76 100644 --- a/submodules/TelegramUI/Sources/FeaturedStickersScreen.swift +++ b/submodules/TelegramUI/Sources/FeaturedStickersScreen.swift @@ -40,8 +40,9 @@ private final class FeaturedPackEntry: Identifiable, Comparable { let installed: Bool let unread: Bool let topSeparator: Bool + let regularInsets: Bool - init(index: Int, info: StickerPackCollectionInfo, theme: PresentationTheme, strings: PresentationStrings, topItems: [StickerPackItem], installed: Bool, unread: Bool, topSeparator: Bool) { + init(index: Int, info: StickerPackCollectionInfo, theme: PresentationTheme, strings: PresentationStrings, topItems: [StickerPackItem], installed: Bool, unread: Bool, topSeparator: Bool, regularInsets: Bool = false) { self.index = index self.info = info self.theme = theme @@ -50,6 +51,7 @@ private final class FeaturedPackEntry: Identifiable, Comparable { self.installed = installed self.unread = unread self.topSeparator = topSeparator + self.regularInsets = regularInsets } var stableId: ItemCollectionId { @@ -81,6 +83,9 @@ private final class FeaturedPackEntry: Identifiable, Comparable { if lhs.topSeparator != rhs.topSeparator { return false } + if lhs.regularInsets != rhs.regularInsets { + return false + } return true } @@ -88,46 +93,36 @@ private final class FeaturedPackEntry: Identifiable, Comparable { return lhs.index < rhs.index } - func item(account: Account, interaction: FeaturedInteraction, grid: Bool) -> GridItem { + func item(account: Account, interaction: FeaturedInteraction, isOther: Bool) -> GridItem { let info = self.info - return StickerPaneSearchGlobalItem(account: account, theme: self.theme, strings: self.strings, listAppearance: true, info: self.info, topItems: self.topItems, grid: grid, topSeparator: self.topSeparator, installed: self.installed, unread: self.unread, open: { + return StickerPaneSearchGlobalItem(account: account, theme: self.theme, strings: self.strings, listAppearance: true, info: self.info, topItems: self.topItems, grid: false, topSeparator: self.topSeparator, regularInsets: self.regularInsets, installed: self.installed, unread: self.unread, open: { interaction.openPack(info) }, install: { interaction.installPack(info, !self.installed) }, getItemIsPreviewed: { item in return interaction.getItemIsPreviewed(item) - }, itemContext: interaction.itemContext) + }, itemContext: interaction.itemContext, sectionTitle: isOther ? self.strings.FeaturedStickers_OtherSection : nil) } } private enum FeaturedEntryId: Hashable { - case search case pack(ItemCollectionId) } private enum FeaturedEntry: Identifiable, Comparable { - case search(theme: PresentationTheme, strings: PresentationStrings) - case pack(FeaturedPackEntry) + case pack(FeaturedPackEntry, Bool) var stableId: FeaturedEntryId { switch self { - case .search: - return .search - case let .pack(pack): + case let .pack(pack, _): return .pack(pack.stableId) } } static func ==(lhs: FeaturedEntry, rhs: FeaturedEntry) -> Bool { switch lhs { - case let .search(lhsTheme, lhsStrings): - if case let .search(rhsTheme, rhsStrings) = rhs, lhsTheme === rhsTheme, lhsStrings === rhsStrings { - return true - } else { - return false - } - case let .pack(pack): - if case .pack(pack) = rhs { + case let .pack(pack, isOther): + if case .pack(pack, isOther) = rhs { return true } else { return false @@ -137,26 +132,18 @@ private enum FeaturedEntry: Identifiable, Comparable { static func <(lhs: FeaturedEntry, rhs: FeaturedEntry) -> Bool { switch lhs { - case .search: - return false - case let .pack(lhsPack): + case let .pack(lhsPack, _): switch rhs { - case .search: - return false - case let .pack(rhsPack): + case let .pack(rhsPack, _): return lhsPack < rhsPack } } } - func item(account: Account, interaction: FeaturedInteraction, grid: Bool) -> GridItem { + func item(account: Account, interaction: FeaturedInteraction) -> GridItem { switch self { - case let .search(theme, strings): - return PaneSearchBarPlaceholderItem(theme: theme, strings: strings, type: .stickers, activate: { - interaction.openSearch() - }) - case let .pack(pack): - return pack.item(account: account, interaction: interaction, grid: grid) + case let .pack(pack, isOther): + return pack.item(account: account, interaction: interaction, isOther: isOther) } } } @@ -172,8 +159,8 @@ private func preparedTransition(from fromEntries: [FeaturedEntry], to toEntries: let (deleteIndices, indicesAndItems, updateIndices) = mergeListsStableWithUpdates(leftList: fromEntries, rightList: toEntries) let deletions = deleteIndices - let insertions = indicesAndItems.map { GridNodeInsertItem(index: $0.0, item: $0.1.item(account: account, interaction: interaction, grid: false), previousIndex: $0.2) } - let updates = updateIndices.map { GridNodeUpdateItem(index: $0.0, previousIndex: $0.2, item: $0.1.item(account: account, interaction: interaction, grid: false)) } + let insertions = indicesAndItems.map { GridNodeInsertItem(index: $0.0, item: $0.1.item(account: account, interaction: interaction), previousIndex: $0.2) } + let updates = updateIndices.map { GridNodeUpdateItem(index: $0.0, previousIndex: $0.2, item: $0.1.item(account: account, interaction: interaction)) } return FeaturedTransition(deletions: deletions, insertions: insertions, updates: updates, initial: initial) } @@ -185,14 +172,14 @@ private func featuredScreenEntries(featuredEntries: [FeaturedStickerPackItem], i for item in featuredEntries { if !existingIds.contains(item.info.id) { existingIds.insert(item.info.id) - result.append(.pack(FeaturedPackEntry(index: index, info: item.info, theme: theme, strings: strings, topItems: item.topItems, installed: installedPacks.contains(item.info.id), unread: item.unread || fixedUnread.contains(item.info.id), topSeparator: index != 0))) + result.append(.pack(FeaturedPackEntry(index: index, info: item.info, theme: theme, strings: strings, topItems: item.topItems, installed: installedPacks.contains(item.info.id), unread: item.unread || fixedUnread.contains(item.info.id), topSeparator: index != 0, regularInsets: true), false)) index += 1 } } for item in additionalPacks { if !existingIds.contains(item.info.id) { existingIds.insert(item.info.id) - result.append(.pack(FeaturedPackEntry(index: index, info: item.info, theme: theme, strings: strings, topItems: item.topItems, installed: installedPacks.contains(item.info.id), unread: item.unread || fixedUnread.contains(item.info.id), topSeparator: index != 0))) + result.append(.pack(FeaturedPackEntry(index: index, info: item.info, theme: theme, strings: strings, topItems: item.topItems, installed: installedPacks.contains(item.info.id), unread: item.unread || fixedUnread.contains(item.info.id), topSeparator: index != 0, regularInsets: true), true)) index += 1 } } @@ -238,6 +225,7 @@ private final class FeaturedStickersScreenNode: ViewControllerTracingNode { self.sendSticker = sendSticker self.gridNode = GridNode() + self.gridNode.floatingSections = true super.init() @@ -1040,7 +1028,7 @@ private enum FeaturedSearchEntry: Identifiable, Comparable { interaction.sendSticker(.standalone(media: stickerItem.file), node, rect) }) case let .global(_, info, topItems, installed, topSeparator): - return StickerPaneSearchGlobalItem(account: account, theme: theme, strings: strings, listAppearance: false, info: info, topItems: topItems, grid: false, topSeparator: topSeparator, installed: installed, unread: false, open: { + return StickerPaneSearchGlobalItem(account: account, theme: theme, strings: strings, listAppearance: false, info: info, topItems: topItems, grid: false, topSeparator: topSeparator, regularInsets: false, installed: installed, unread: false, open: { interaction.open(info) }, install: { interaction.install(info, topItems, !installed) diff --git a/submodules/TelegramUI/Sources/StickerPaneSearchContentNode.swift b/submodules/TelegramUI/Sources/StickerPaneSearchContentNode.swift index 297e816a51..b30694ba36 100644 --- a/submodules/TelegramUI/Sources/StickerPaneSearchContentNode.swift +++ b/submodules/TelegramUI/Sources/StickerPaneSearchContentNode.swift @@ -106,7 +106,7 @@ private enum StickerSearchEntry: Identifiable, Comparable { case let .global(_, info, topItems, installed, topSeparator): let itemContext = StickerPaneSearchGlobalItemContext() itemContext.canPlayMedia = true - return StickerPaneSearchGlobalItem(account: account, theme: theme, strings: strings, listAppearance: false, info: info, topItems: topItems, grid: false, topSeparator: topSeparator, installed: installed, unread: false, open: { + return StickerPaneSearchGlobalItem(account: account, theme: theme, strings: strings, listAppearance: false, info: info, topItems: topItems, grid: false, topSeparator: topSeparator, regularInsets: false, installed: installed, unread: false, open: { interaction.open(info) }, install: { interaction.install(info, topItems, !installed) diff --git a/submodules/TelegramUI/Sources/StickerPaneSearchGlobaltem.swift b/submodules/TelegramUI/Sources/StickerPaneSearchGlobaltem.swift index e30033e03a..54d59b79db 100644 --- a/submodules/TelegramUI/Sources/StickerPaneSearchGlobaltem.swift +++ b/submodules/TelegramUI/Sources/StickerPaneSearchGlobaltem.swift @@ -8,27 +8,65 @@ import SwiftSignalKit import Postbox import TelegramPresentationData import StickerPackPreviewUI +import ListSectionHeaderNode final class StickerPaneSearchGlobalSection: GridSection { - let height: CGFloat = 0.0 + let title: String? + let theme: PresentationTheme - var hashValue: Int { - return 0 + var height: CGFloat { + if let _ = self.title { + return 28.0 + } else { + return 0.0 + } } - init() { + var hashValue: Int { + if let _ = self.title { + return 1 + } else { + return 0 + } + } + + init(title: String?, theme: PresentationTheme) { + self.title = title + self.theme = theme } func isEqual(to: GridSection) -> Bool { - if to is StickerPaneSearchGlobalSection { - return true + if let to = to as? StickerPaneSearchGlobalSection { + return to.hashValue == self.hashValue } else { return false } } func node() -> ASDisplayNode { - return ASDisplayNode() + return StickerPaneSearchGlobalSectionNode(theme: self.theme, title: self.title ?? "") + } +} + +private final class StickerPaneSearchGlobalSectionNode: ASDisplayNode { + private let node: ListSectionHeaderNode + + init(theme: PresentationTheme, title: String) { + self.node = ListSectionHeaderNode(theme: theme) + + super.init() + + if !title.isEmpty { + self.node.title = title + self.addSubnode(self.node) + } + } + + override func layout() { + super.layout() + + self.node.frame = self.bounds + self.node.updateLayout(size: self.bounds.size, leftInset: 0.0, rightInset: 0.0) } } @@ -45,6 +83,7 @@ final class StickerPaneSearchGlobalItem: GridItem { let topItems: [StickerPackItem] let grid: Bool let topSeparator: Bool + let regularInsets: Bool let installed: Bool let installing: Bool let unread: Bool @@ -53,12 +92,22 @@ final class StickerPaneSearchGlobalItem: GridItem { let getItemIsPreviewed: (StickerPackItem) -> Bool let itemContext: StickerPaneSearchGlobalItemContext - let section: GridSection? = StickerPaneSearchGlobalSection() + let section: GridSection? var fillsRowWithHeight: CGFloat? { - return self.grid ? nil : (128.0 + (self.topSeparator ? 12.0 : 0.0)) + var additionalHeight: CGFloat = 0.0 + if self.regularInsets { + additionalHeight = 12.0 + 12.0 + } else { + additionalHeight += 12.0 + if self.topSeparator { + additionalHeight += 12.0 + } + } + + return self.grid ? nil : (128.0 + additionalHeight) } - init(account: Account, theme: PresentationTheme, strings: PresentationStrings, listAppearance: Bool, info: StickerPackCollectionInfo, topItems: [StickerPackItem], grid: Bool, topSeparator: Bool, installed: Bool, installing: Bool = false, unread: Bool, open: @escaping () -> Void, install: @escaping () -> Void, getItemIsPreviewed: @escaping (StickerPackItem) -> Bool, itemContext: StickerPaneSearchGlobalItemContext) { + init(account: Account, theme: PresentationTheme, strings: PresentationStrings, listAppearance: Bool, info: StickerPackCollectionInfo, topItems: [StickerPackItem], grid: Bool, topSeparator: Bool, regularInsets: Bool, installed: Bool, installing: Bool = false, unread: Bool, open: @escaping () -> Void, install: @escaping () -> Void, getItemIsPreviewed: @escaping (StickerPackItem) -> Bool, itemContext: StickerPaneSearchGlobalItemContext, sectionTitle: String? = nil) { self.account = account self.theme = theme self.strings = strings @@ -67,6 +116,7 @@ final class StickerPaneSearchGlobalItem: GridItem { self.topItems = topItems self.grid = grid self.topSeparator = topSeparator + self.regularInsets = regularInsets self.installed = installed self.installing = installing self.unread = unread @@ -74,6 +124,7 @@ final class StickerPaneSearchGlobalItem: GridItem { self.install = install self.getItemIsPreviewed = getItemIsPreviewed self.itemContext = itemContext + self.section = StickerPaneSearchGlobalSection(title: sectionTitle, theme: theme) } func node(layout: GridNodeLayout, synchronousLoad: Bool) -> GridItemNode { @@ -279,13 +330,21 @@ class StickerPaneSearchGlobalItemNode: GridItemNode { let params = ListViewItemLayoutParams(width: size.width, leftInset: 0.0, rightInset: 0.0, availableHeight: size.height) - var topOffset: CGFloat = 12.0 - if item.topSeparator { + let topSeparatorOffset: CGFloat + var topOffset: CGFloat = 0.0 + if item.regularInsets { + topOffset = 12.0 + topSeparatorOffset = -UIScreenPixel + } else { + topSeparatorOffset = 16.0 topOffset += 12.0 + if item.topSeparator { + topOffset += 12.0 + } } self.topSeparatorNode.isHidden = !item.topSeparator - self.topSeparatorNode.frame = CGRect(origin: CGPoint(x: 16.0, y: 16.0), size: CGSize(width: params.width - 16.0 * 2.0, height: UIScreenPixel)) + self.topSeparatorNode.frame = CGRect(origin: CGPoint(x: 16.0, y: topSeparatorOffset), size: CGSize(width: params.width - 16.0 * 2.0, height: UIScreenPixel)) if item.listAppearance { self.topSeparatorNode.backgroundColor = item.theme.list.itemPlainSeparatorColor } else { diff --git a/submodules/WalletUI/Resources/WalletStrings.mapping b/submodules/WalletUI/Resources/WalletStrings.mapping index 1246758922535bca4d24a763b4150cc1ff0b4957..d38b0e0300080115b02bd8f6670183d9196a04fa 100644 GIT binary patch delta 17 ZcmaFn_{?#`Duu}>6=WG1Cofl!0{}_;2HXGu delta 17 ZcmaFn_{?#`Duv0X6{Hy%Cofk}002q>2HpSw diff --git a/submodules/WalletUI/Sources/WalletStrings.swift b/submodules/WalletUI/Sources/WalletStrings.swift index b25bf2d505..759572d1b4 100644 --- a/submodules/WalletUI/Sources/WalletStrings.swift +++ b/submodules/WalletUI/Sources/WalletStrings.swift @@ -449,12 +449,12 @@ public final class WalletStrings: Equatable { public var Wallet_SecureStorageReset_Title: String { return self._s[219]! } public var Wallet_Receive_CommentHeader: String { return self._s[220]! } public var Wallet_Info_ReceiveGrams: String { return self._s[221]! } - public func Wallet_Updated_HoursAgo(_ value: Int32) -> String { + public func Wallet_Updated_MinutesAgo(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = walletStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[0 * 6 + Int(form.rawValue)]!, stringValue) } - public func Wallet_Updated_MinutesAgo(_ value: Int32) -> String { + public func Wallet_Updated_HoursAgo(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = walletStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[1 * 6 + Int(form.rawValue)]!, stringValue) From a8551d9848ad9d27277a20078cda03e3378c6c53 Mon Sep 17 00:00:00 2001 From: Ali <> Date: Sat, 18 Apr 2020 18:35:05 +0400 Subject: [PATCH 02/12] Small fixes --- Telegram/Telegram-iOS/en.lproj/Localizable.strings | 2 +- submodules/TelegramUI/Sources/ChatController.swift | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/Telegram/Telegram-iOS/en.lproj/Localizable.strings b/Telegram/Telegram-iOS/en.lproj/Localizable.strings index 3ff95d7ddb..8c0197bc8c 100644 --- a/Telegram/Telegram-iOS/en.lproj/Localizable.strings +++ b/Telegram/Telegram-iOS/en.lproj/Localizable.strings @@ -5493,4 +5493,4 @@ Any member of this group will be able to see messages in the channel."; "CreatePoll.Explanation" = "Add a Comment (Optional)"; "CreatePoll.ExplanationInfo" = "Users will see this comment after choosing a wrong answer, good for educational purposes."; -"FeaturedStickers.OtherSection" = "OTHER"; +"FeaturedStickers.OtherSection" = "OTHER STICKERS"; diff --git a/submodules/TelegramUI/Sources/ChatController.swift b/submodules/TelegramUI/Sources/ChatController.swift index a528d050fe..7b5e8a11a5 100644 --- a/submodules/TelegramUI/Sources/ChatController.swift +++ b/submodules/TelegramUI/Sources/ChatController.swift @@ -7995,6 +7995,8 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G var parsedUrlValue: URL? if let parsed = URL(string: url) { parsedUrlValue = parsed + } else if let parsed = URL(string: "https://" + url) { + parsedUrlValue = parsed } else if let encoded = url.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed), let parsed = URL(string: encoded) { parsedUrlValue = parsed } @@ -8007,7 +8009,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G latin.insert(charactersIn: "a"..."z") latin.insert(charactersIn: "0"..."9") var punctuation = CharacterSet() - punctuation.insert(charactersIn: ".-") + punctuation.insert(charactersIn: ".-/+") var hasLatin = false var hasNonLatin = false for c in rawHost { From 2b9347a3e5a45d06e3fac101f8101a93daa0c185 Mon Sep 17 00:00:00 2001 From: Ali <> Date: Mon, 20 Apr 2020 19:51:46 +0400 Subject: [PATCH 03/12] Fix tz_offset [skip ci] --- submodules/BuildConfig/Sources/BuildConfig.m | 2 ++ submodules/MtProtoKit/Sources/MTRequestMessageService.m | 6 ++---- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/submodules/BuildConfig/Sources/BuildConfig.m b/submodules/BuildConfig/Sources/BuildConfig.m index f4808b26cb..afd727fcc8 100644 --- a/submodules/BuildConfig/Sources/BuildConfig.m +++ b/submodules/BuildConfig/Sources/BuildConfig.m @@ -146,6 +146,8 @@ API_AVAILABLE(ios(10)) dataDict[@"device_token"] = [appToken base64EncodedStringWithOptions:0]; dataDict[@"device_token_type"] = @"voip"; } + float tzOffset = ([[NSTimeZone systemTimeZone] secondsFromGMT] / 3600.0); + dataDict[@"tz_offset"] = @((int)tzOffset); if (signatureDict != nil) { for (id key in signatureDict.allKeys) { dataDict[key] = signatureDict[key]; diff --git a/submodules/MtProtoKit/Sources/MTRequestMessageService.m b/submodules/MtProtoKit/Sources/MTRequestMessageService.m index a3cf893d06..23f12dc625 100644 --- a/submodules/MtProtoKit/Sources/MTRequestMessageService.m +++ b/submodules/MtProtoKit/Sources/MTRequestMessageService.m @@ -300,9 +300,7 @@ [buffer appendInt32:(int32_t)0xda9b0d0d]; [buffer appendInt32:(int32_t)[_serialization currentLayer]]; - //initConnection#785188b8 {X:Type} flags:# api_id:int device_model:string system_version:string app_version:string system_lang_code:string lang_pack:string lang_code:string proxy:flags.0?InputClientProxy query:!X = X; - - //inputClientProxy address:string port:int = InputClientProxy; + //initConnection#c1cd5ea9 {X:Type} flags:# api_id:int device_model:string system_version:string app_version:string system_lang_code:string lang_pack:string lang_code:string proxy:flags.0?InputClientProxy query:!X = X; int32_t flags = 0; if (_apiEnvironment.socksProxySettings.secret != nil) { @@ -312,7 +310,7 @@ flags |= (1 << 1); } - [buffer appendInt32:(int32_t)0x785188b8]; + [buffer appendInt32:(int32_t)0xc1cd5ea9]; [buffer appendInt32:flags]; [buffer appendInt32:(int32_t)_apiEnvironment.apiId]; [buffer appendTLString:_apiEnvironment.deviceModel]; From c97bc29a2068ab962be5fcba1465afae1386045c Mon Sep 17 00:00:00 2001 From: Ali <> Date: Tue, 21 Apr 2020 22:24:03 +0400 Subject: [PATCH 04/12] Experimental gigapixel image support --- .../GalleryUI/Sources/GalleryController.swift | 2 +- .../Sources/Items/ChatImageGalleryItem.swift | 318 +++++++++++++++++- .../ZoomableContentGalleryItemNode.swift | 35 +- 3 files changed, 329 insertions(+), 26 deletions(-) diff --git a/submodules/GalleryUI/Sources/GalleryController.swift b/submodules/GalleryUI/Sources/GalleryController.swift index 448039e228..4d3958814b 100644 --- a/submodules/GalleryUI/Sources/GalleryController.swift +++ b/submodules/GalleryUI/Sources/GalleryController.swift @@ -183,7 +183,7 @@ public func galleryItemForEntry(context: AccountContext, presentationData: Prese if let dimensions = file.dimensions { pixelsCount = Int(dimensions.width) * Int(dimensions.height) } - if (file.size == nil || file.size! < 4 * 1024 * 1024) && pixelsCount < 4096 * 4096 { + if true /*(file.size == nil || file.size! < 4 * 1024 * 1024) && pixelsCount < 4096 * 4096*/ { return ChatImageGalleryItem(context: context, presentationData: presentationData, message: message, location: location, performAction: performAction, openActionOptions: openActionOptions) } else { return ChatDocumentGalleryItem(context: context, presentationData: presentationData, message: message, location: location) diff --git a/submodules/GalleryUI/Sources/Items/ChatImageGalleryItem.swift b/submodules/GalleryUI/Sources/Items/ChatImageGalleryItem.swift index b1cd1df564..18c97b68c5 100644 --- a/submodules/GalleryUI/Sources/Items/ChatImageGalleryItem.swift +++ b/submodules/GalleryUI/Sources/Items/ChatImageGalleryItem.swift @@ -162,6 +162,7 @@ final class ChatImageGalleryItemNode: ZoomableContentGalleryItemNode { private var message: Message? private let imageNode: TransformImageNode + private var tilingNode: TilingNode? fileprivate let _ready = Promise() fileprivate let _title = Promise() fileprivate let _rightBarButtonItem = Promise(nil) @@ -173,6 +174,7 @@ final class ChatImageGalleryItemNode: ZoomableContentGalleryItemNode { private var fetchDisposable = MetaDisposable() private let statusDisposable = MetaDisposable() + private let dataDisposable = MetaDisposable() private var status: MediaResourceStatus? init(context: AccountContext, presentationData: PresentationData, performAction: @escaping (GalleryControllerInteractionTapAction) -> Void, openActionOptions: @escaping (GalleryControllerInteractionTapAction) -> Void) { @@ -208,6 +210,7 @@ final class ChatImageGalleryItemNode: ZoomableContentGalleryItemNode { deinit { //self.fetchDisposable.dispose() self.statusDisposable.dispose() + self.dataDisposable.dispose() } override func ready() -> Signal { @@ -247,6 +250,7 @@ final class ChatImageGalleryItemNode: ZoomableContentGalleryItemNode { return generate } self.imageNode.setSignal(signal) + self.zoomableContent = (largestSize.dimensions.cgSize, self.imageNode) self.fetchDisposable.set(fetchedMediaResource(mediaBox: self.context.account.postbox.mediaBox, reference: imageReference.resourceReference(largestSize.resource)).start()) @@ -262,6 +266,38 @@ final class ChatImageGalleryItemNode: ZoomableContentGalleryItemNode { self.contextAndMedia = (self.context, imageReference.abstract) } + private func updateImageFromFile(path: String) { + if let _ = self.tilingNode { + self.tilingNode = nil + } + + guard let dataProvider = CGDataProvider(url: URL(fileURLWithPath: path) as CFURL) else { + self._ready.set(.single(Void())) + return + } + + var maybeImage: CGImage? + + if let image = CGImage(jpegDataProviderSource: dataProvider, decode: nil, shouldInterpolate: true, intent: .defaultIntent) { + maybeImage = image + } else if let image = CGImage(pngDataProviderSource: dataProvider, decode: nil, shouldInterpolate: true, intent: .defaultIntent) { + maybeImage = image + } + + guard let image = maybeImage else { + self._ready.set(.single(Void())) + return + } + + let tilingNode = TilingNode(image: image, path: path) + self.tilingNode = tilingNode + + let size = CGSize(width: image.width, height: image.height) + self.zoomableContent = (size, tilingNode) + + self._ready.set(.single(Void())) + } + @objc func openStickersButtonPressed() { guard let (context, media) = self.contextAndMedia else { return @@ -314,7 +350,22 @@ final class ChatImageGalleryItemNode: ZoomableContentGalleryItemNode { } } self.imageNode.asyncLayout()(TransformImageArguments(corners: ImageCorners(), imageSize: displaySize, boundingSize: displaySize, intrinsicInsets: UIEdgeInsets()))() - self.imageNode.setSignal(chatMessageImageFile(account: context.account, fileReference: fileReference, thumbnail: false), dispatchOnDisplayLink: false) + + if largestSize.width > 2600 || largestSize.height > 2600 { + self.dataDisposable.set((self.context.account.postbox.mediaBox.resourceData(fileReference.media.resource) + |> deliverOnMainQueue).start(next: { [weak self] data in + guard let strongSelf = self else { + return + } + if !data.complete { + return + } + strongSelf.updateImageFromFile(path: data.path) + })) + } else { + self.imageNode.setSignal(chatMessageImageFile(account: context.account, fileReference: fileReference, thumbnail: false), dispatchOnDisplayLink: false) + } + self.zoomableContent = (largestSize.cgSize, self.imageNode) self.setupStatus(resource: fileReference.media.resource) } else { @@ -370,16 +421,18 @@ final class ChatImageGalleryItemNode: ZoomableContentGalleryItemNode { } override func animateIn(from node: (ASDisplayNode, CGRect, () -> (UIView?, UIView?)), addToTransitionSurface: (UIView) -> Void) { - var transformedFrame = node.0.view.convert(node.0.view.bounds, to: self.imageNode.view) - let transformedSuperFrame = node.0.view.convert(node.0.view.bounds, to: self.imageNode.view.superview) + let contentNode = self.tilingNode ?? self.imageNode + + var transformedFrame = node.0.view.convert(node.0.view.bounds, to: contentNode.view) + let transformedSuperFrame = node.0.view.convert(node.0.view.bounds, to: contentNode.view.superview) let transformedSelfFrame = node.0.view.convert(node.0.view.bounds, to: self.view) - /*let projectedScale = CGPoint(x: self.imageNode.view.bounds.width / node.1.width, y: self.imageNode.view.bounds.height / node.1.height) + /*let projectedScale = CGPoint(x: contentNode.view.bounds.width / node.1.width, y: contentNode.view.bounds.height / node.1.height) let scaledLocalImageViewBounds = CGRect(x: -node.1.minX * projectedScale.x, y: -node.1.minY * projectedScale.y, width: node.0.bounds.width * projectedScale.x, height: node.0.bounds.height * projectedScale.y)*/ - let scaledLocalImageViewBounds = self.imageNode.view.bounds + let scaledLocalImageViewBounds = contentNode.view.bounds - let transformedCopyViewFinalFrame = self.imageNode.view.convert(scaledLocalImageViewBounds, to: self.view) + let transformedCopyViewFinalFrame = contentNode.view.convert(scaledLocalImageViewBounds, to: self.view) let (maybeSurfaceCopyView, _) = node.2() let (maybeCopyView, copyViewBackgrond) = node.2() @@ -393,7 +446,7 @@ final class ChatImageGalleryItemNode: ZoomableContentGalleryItemNode { var transformedSurfaceFinalFrame: CGRect? if let contentSurface = surfaceCopyView.superview { transformedSurfaceFrame = node.0.view.convert(node.0.view.bounds, to: contentSurface) - transformedSurfaceFinalFrame = self.imageNode.view.convert(scaledLocalImageViewBounds, to: contentSurface) + transformedSurfaceFinalFrame = contentNode.view.convert(scaledLocalImageViewBounds, to: contentSurface) } if let transformedSurfaceFrame = transformedSurfaceFrame { @@ -423,11 +476,11 @@ final class ChatImageGalleryItemNode: ZoomableContentGalleryItemNode { surfaceCopyView.layer.animate(from: NSValue(caTransform3D: CATransform3DIdentity), to: NSValue(caTransform3D: CATransform3DMakeScale(scale.width, scale.height, 1.0)), keyPath: "transform", timingFunction: kCAMediaTimingFunctionSpring, duration: 0.25, removeOnCompletion: false) } - self.imageNode.layer.animatePosition(from: CGPoint(x: transformedSuperFrame.midX, y: transformedSuperFrame.midY), to: self.imageNode.layer.position, duration: positionDuration, timingFunction: kCAMediaTimingFunctionSpring) - self.imageNode.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.1) + contentNode.layer.animatePosition(from: CGPoint(x: transformedSuperFrame.midX, y: transformedSuperFrame.midY), to: contentNode.layer.position, duration: positionDuration, timingFunction: kCAMediaTimingFunctionSpring) + contentNode.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.1) transformedFrame.origin = CGPoint() - self.imageNode.layer.animateBounds(from: transformedFrame, to: self.imageNode.layer.bounds, duration: 0.25, timingFunction: kCAMediaTimingFunctionSpring) + contentNode.layer.animateBounds(from: transformedFrame, to: contentNode.layer.bounds, duration: 0.25, timingFunction: kCAMediaTimingFunctionSpring) self.statusNodeContainer.layer.animatePosition(from: CGPoint(x: transformedSuperFrame.midX, y: transformedSuperFrame.midY), to: self.statusNodeContainer.position, duration: positionDuration, timingFunction: kCAMediaTimingFunctionSpring) self.statusNodeContainer.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.25, timingFunction: kCAMediaTimingFunctionSpring) @@ -437,10 +490,12 @@ final class ChatImageGalleryItemNode: ZoomableContentGalleryItemNode { override func animateOut(to node: (ASDisplayNode, CGRect, () -> (UIView?, UIView?)), addToTransitionSurface: (UIView) -> Void, completion: @escaping () -> Void) { self.fetchDisposable.set(nil) - var transformedFrame = node.0.view.convert(node.0.view.bounds, to: self.imageNode.view) - let transformedSuperFrame = node.0.view.convert(node.0.view.bounds, to: self.imageNode.view.superview) + let contentNode = self.tilingNode ?? self.imageNode + + var transformedFrame = node.0.view.convert(node.0.view.bounds, to: contentNode.view) + let transformedSuperFrame = node.0.view.convert(node.0.view.bounds, to: contentNode.view.superview) let transformedSelfFrame = node.0.view.convert(node.0.view.bounds, to: self.view) - let transformedCopyViewInitialFrame = self.imageNode.view.convert(self.imageNode.view.bounds, to: self.view) + let transformedCopyViewInitialFrame = contentNode.view.convert(contentNode.view.bounds, to: self.view) var positionCompleted = false var boundsCompleted = false @@ -458,7 +513,7 @@ final class ChatImageGalleryItemNode: ZoomableContentGalleryItemNode { var transformedSurfaceCopyViewInitialFrame: CGRect? if let contentSurface = surfaceCopyView.superview { transformedSurfaceFrame = node.0.view.convert(node.0.view.bounds, to: contentSurface) - transformedSurfaceCopyViewInitialFrame = self.imageNode.view.convert(self.imageNode.view.bounds, to: contentSurface) + transformedSurfaceCopyViewInitialFrame = contentNode.view.convert(contentNode.view.bounds, to: contentSurface) } self.view.insertSubview(copyView, belowSubview: self.scrollNode.view) @@ -488,15 +543,15 @@ final class ChatImageGalleryItemNode: ZoomableContentGalleryItemNode { surfaceCopyView.layer.animate(from: NSValue(caTransform3D: CATransform3DMakeScale(scale.width, scale.height, 1.0)), to: NSValue(caTransform3D: CATransform3DIdentity), keyPath: "transform", timingFunction: kCAMediaTimingFunctionSpring, duration: 0.25, removeOnCompletion: false) } - self.imageNode.layer.animatePosition(from: self.imageNode.layer.position, to: CGPoint(x: transformedSuperFrame.midX, y: transformedSuperFrame.midY), duration: 0.25, timingFunction: kCAMediaTimingFunctionSpring, removeOnCompletion: false, completion: { _ in + contentNode.layer.animatePosition(from: contentNode.layer.position, to: CGPoint(x: transformedSuperFrame.midX, y: transformedSuperFrame.midY), duration: 0.25, timingFunction: kCAMediaTimingFunctionSpring, removeOnCompletion: false, completion: { _ in positionCompleted = true intermediateCompletion() }) - self.imageNode.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.08, removeOnCompletion: false) + contentNode.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.08, removeOnCompletion: false) transformedFrame.origin = CGPoint() - self.imageNode.layer.animateBounds(from: self.imageNode.layer.bounds, to: transformedFrame, duration: 0.25, timingFunction: kCAMediaTimingFunctionSpring, removeOnCompletion: false, completion: { _ in + contentNode.layer.animateBounds(from: contentNode.layer.bounds, to: transformedFrame, duration: 0.25, timingFunction: kCAMediaTimingFunctionSpring, removeOnCompletion: false, completion: { _ in boundsCompleted = true intermediateCompletion() }) @@ -552,3 +607,232 @@ final class ChatImageGalleryItemNode: ZoomableContentGalleryItemNode { } } } + +/*private func tileRectForImage(_ mappedImage: CGImage, rect: CGRect) -> CGRect { + let scaleX = CGFloat(mappedImage.width) / lowResolutionImage.size.width + let scaleY = CGFloat(mappedImage.height) / lowResolutionImage.size.height + + let mappedX = rect.minX * scaleX + let mappedY = rect.minY * scaleY + let mappedWidth = rect.width * scaleX + let mappedHeight = rect.height * scaleY + + return CGRect(x: mappedX, y: mappedY, width: mappedWidth, height: mappedHeight) +}*/ + +private func zoomScale(for zoomLevel: CGFloat) -> CGFloat { + return pow(2.0, zoomLevel - 1.0) +} + +private func zoomLevel(for zoomScale: CGFloat) -> CGFloat { + return log2(zoomScale) + 1.0 +} + +private final class TilingLayer: CATiledLayer { + override var contentsScale: CGFloat { + get { + return super.contentsScale + } set(value) { + super.contentsScale = value + } + } +} + +class TilingView: UIView { + let image: CGImage + let path: String + var cachedScaledImage: UIImage? + + let imageSize: CGSize + let tileSize: CGSize + var normalizedSize: CGSize? + + override static var layerClass: AnyClass { + return TilingLayer.self + } + + private var tiledLayer: TilingLayer { + return self.layer as! TilingLayer + } + + init(image: CGImage, path: String) { + self.image = image + self.path = path + + self.tileSize = CGSize(width: 256.0, height: 256.0) + self.imageSize = CGSize(width: image.width, height: image.height) + + super.init(frame: CGRect()) + + self.tiledLayer.contentsScale = UIScreenScale + let scale = self.tiledLayer.contentsScale + self.tiledLayer.tileSize = CGSize(width: self.tileSize.width * scale, height: self.tileSize.height * scale) + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + override var intrinsicContentSize: CGSize { + return self.imageSize + } + + func setMaximumZoomScale(_ value: CGFloat, normalizedSize: CGSize) { + if self.normalizedSize != normalizedSize { + self.normalizedSize = normalizedSize + + /*let options: [CFString: Any] = [ + kCGImageSourceCreateThumbnailFromImageIfAbsent: true, + kCGImageSourceCreateThumbnailWithTransform: true, + kCGImageSourceShouldCacheImmediately: false, + kCGImageSourceThumbnailMaxPixelSize: Int(max(self.imageSize.width / 4.0, self.imageSize.height / 4.0)) + ] + + let startTime = CACurrentMediaTime() + if let imageSource = CGImageSourceCreateWithURL(URL(fileURLWithPath: self.path) as CFURL, nil), let image = CGImageSourceCreateThumbnailAtIndex(imageSource, 0, options as CFDictionary) { + self.cachedScaledImage = UIImage(cgImage: image) + } + print("create thumbnail: \((CACurrentMediaTime() - startTime) * 1000.0) ms")*/ + } + + let levels = max(1, Int(zoomLevel(for: value))) + self.tiledLayer.levelsOfDetail = levels + self.tiledLayer.levelsOfDetailBias = levels - 1 + } + + override func draw(_ rect: CGRect) { + guard let normalizedSize = self.normalizedSize else { + return + } + guard let context = UIGraphicsGetCurrentContext() else { + return + } + let image = self.image + let cachedScaledImage = self.cachedScaledImage + let imageSize = self.imageSize + context.setBlendMode(.copy) + + let contentScale = context.ctm.a + let normalizedContentScale = contentScale / UIScreenScale + + let normalizedRect = rect + + let normalizationScale = imageSize.width / normalizedSize.width + + let normalizedCroppingRect = CGRect(origin: CGPoint(x: normalizedRect.minX * normalizationScale, y: normalizedRect.minY * normalizationScale), size: CGSize(width: normalizedRect.width * normalizationScale, height: normalizedRect.height * normalizationScale)) + + let tileSizes: [CGFloat] = [ + //8192.0, + //4096.0, + 2048.0, + 1024.0, + 512.0, + 256.0 + ] + + var maximumTileSize: CGFloat = tileSizes[0] + for i in (0 ..< tileSizes.count).reversed() { + if tileSizes[i] > normalizedCroppingRect.width { + break + } + maximumTileSize = tileSizes[i] + } + + let xMinTile = Int(floor(normalizedCroppingRect.minX / maximumTileSize)) + let xMaxTile = Int(ceil(normalizedCroppingRect.maxX / maximumTileSize)) + let yMinTile = Int(floor(normalizedCroppingRect.minY / maximumTileSize)) + let yMaxTile = Int(ceil(normalizedCroppingRect.maxY / maximumTileSize)) + + for y in yMinTile ... yMaxTile { + let imageMinY = floor(CGFloat(y) * maximumTileSize) + var imageMaxY = ceil(CGFloat(y + 1) * maximumTileSize) + imageMaxY = min(imageMaxY, imageSize.height) + if imageMaxY <= imageMinY { + continue + } + + for x in xMinTile ... xMaxTile { + let imageMinX = floor(CGFloat(x) * maximumTileSize) + var imageMaxX = ceil(CGFloat(x + 1) * maximumTileSize) + imageMaxX = min(imageMaxX, imageSize.width) + if imageMaxX <= imageMinX { + continue + } + + let imageRect = CGRect(origin: CGPoint(x: imageMinX, y: imageMinY), size: CGSize(width: imageMaxX - imageMinX, height: imageMaxY - imageMinY)) + + let drawingRect = CGRect(origin: CGPoint(x: imageRect.minX / normalizationScale, y: imageRect.minY / normalizationScale), size: CGSize(width: imageRect.width / normalizationScale, height: imageRect.height / normalizationScale)) + + var tileImage: CGImage? + if normalizedContentScale < 1.1, let cachedScaledImage = cachedScaledImage { + let cachedScale = cachedScaledImage.size.width / self.imageSize.width + let scaledImageRect = CGRect(origin: CGPoint(x: imageRect.minX * cachedScale, y: imageRect.minY * cachedScale), size: CGSize(width: imageRect.width * cachedScale, height: imageRect.height * cachedScale)) + tileImage = cachedScaledImage.cgImage!.cropping(to: scaledImageRect) + } else { + tileImage = image.cropping(to: imageRect) + } + + if let tileImage = tileImage { + var scaledSide = max(imageRect.width, imageRect.height) + let targetSide = max(drawingRect.width, drawingRect.height) + while true { + let maybeSide = round(scaledSide * 0.5) + if maybeSide < targetSide { + break + } else { + scaledSide = maybeSide + } + } + + /*let scaledSize = imageRect.size.fitted(CGSize(width: scaledSide, height: scaledSide)) + let scaledImage = generateImage(scaledSize, contextGenerator: { size, scaledContext in + scaledContext.setBlendMode(.copy) + let startTime = CACurrentMediaTime() + scaledContext.draw(tileImage, in: CGRect(origin: CGPoint(), size: size)) + print("draw scaled: \((CACurrentMediaTime() - startTime) * 1000.0) ms") + }, opaque: true, scale: UIScreenScale) + + if let scaledImage = scaledImage { + scaledImage.draw(in: drawingRect.insetBy(dx: -0.5, dy: -0.5), blendMode: .copy, alpha: 1.0) + }*/ + + let startTime = CACurrentMediaTime() + context.translateBy(x: drawingRect.midX, y: drawingRect.midY) + context.scaleBy(x: 1.0, y: -1.0) + context.translateBy(x: -drawingRect.midX, y: -drawingRect.midY) + context.draw(tileImage, in: drawingRect.insetBy(dx: -0.5, dy: -0.5)) + context.translateBy(x: drawingRect.midX, y: drawingRect.midY) + context.scaleBy(x: 1.0, y: -1.0) + context.translateBy(x: -drawingRect.midX, y: -drawingRect.midY) + print("draw direct: \((CACurrentMediaTime() - startTime) * 1000.0) ms") + } + } + } + } + + private func annotate(rect: CGRect, col: Int, row: Int, zoomLevel: CGFloat, scale: CGFloat, context: CGContext) { + let lineWidth = 2.0 / scale + let halfLineWidth = lineWidth / 2.0 + //let fontSize = 12.0 / scale + + //NSString *pointString = [NSString stringWithFormat:@"%@x(%@, %@) @%@x", @(zoomLevel), @(col), @(row), @([UIScreen mainScreen].scale)]; + //CGPoint textOrigin = CGPointMake(CGRectGetMinX(rect) + lineWidth, CGRectGetMinY(rect) + lineWidth); + /*[pointString drawAtPoint:textOrigin withAttributes:@{ + NSFontAttributeName: [UIFont boldSystemFontOfSize:fontSize], + NSForegroundColorAttributeName: [UIColor darkGrayColor] + }];*/ + context.setFillColor(UIColor.red.cgColor) + context.setLineWidth(lineWidth) + context.stroke(rect.insetBy(dx: halfLineWidth, dy: halfLineWidth)) + } +} + +private final class TilingNode: ASDisplayNode { + init(image: CGImage, path: String) { + super.init() + + self.setViewBlock { + return TilingView(image: image, path: path) + } + } +} diff --git a/submodules/GalleryUI/Sources/ZoomableContentGalleryItemNode.swift b/submodules/GalleryUI/Sources/ZoomableContentGalleryItemNode.swift index 504b7c6cbf..f505551bdc 100644 --- a/submodules/GalleryUI/Sources/ZoomableContentGalleryItemNode.swift +++ b/submodules/GalleryUI/Sources/ZoomableContentGalleryItemNode.swift @@ -137,16 +137,27 @@ open class ZoomableContentGalleryItemNode: GalleryItemNode, UIScrollViewDelegate return } + let boundsSize = self.scrollNode.view.bounds.size + if contentSize.width.isLessThanOrEqualTo(0.0) || contentSize.height.isLessThanOrEqualTo(0.0) || boundsSize.width.isLessThanOrEqualTo(0.0) || boundsSize.height.isLessThanOrEqualTo(0.0) { + return + } + + let normalizedContentSize = contentSize.fitted(boundsSize) + self.ignoreZoom = true self.ignoreZoomTransition = transition self.scrollNode.view.minimumZoomScale = 1.0 self.scrollNode.view.maximumZoomScale = 1.0 //self.scrollView.normalZoomScale = 1.0 self.scrollNode.view.zoomScale = 1.0 - self.scrollNode.view.contentSize = contentSize - contentNode.transform = CATransform3DIdentity - contentNode.frame = CGRect(origin: CGPoint(), size: contentSize) + self.scrollNode.view.contentSize = normalizedContentSize + + if !(contentNode.view is TilingView) { + contentNode.transform = CATransform3DIdentity + } + + contentNode.frame = CGRect(origin: CGPoint(), size: normalizedContentSize) self.centerScrollViewContents(transition: transition) self.ignoreZoom = false @@ -165,11 +176,15 @@ open class ZoomableContentGalleryItemNode: GalleryItemNode, UIScrollViewDelegate return } - let scaleWidth = boundsSize.width / contentSize.width - let scaleHeight = boundsSize.height / contentSize.height - let minScale = min(scaleWidth, scaleHeight) + let normalizedContentSize = contentSize.fitted(boundsSize) + + let scaleWidth = boundsSize.width / normalizedContentSize.width + let scaleHeight = boundsSize.height / normalizedContentSize.height + var minScale = min(scaleWidth, scaleHeight) + minScale = 1.0 + var maxScale = max(scaleWidth, scaleHeight) - maxScale = max(maxScale, minScale * 3.0) + maxScale = max(maxScale, minScale * 4.0) if (abs(maxScale - minScale) < 0.01) { maxScale = minScale @@ -187,6 +202,10 @@ open class ZoomableContentGalleryItemNode: GalleryItemNode, UIScrollViewDelegate self.scrollNode.view.maximumZoomScale = maxScale } + if let contentView = contentNode.view as? TilingView { + contentView.setMaximumZoomScale(maxScale, normalizedSize: normalizedContentSize) + } + var contentFrame = contentNode.view.frame if boundsSize.width > contentFrame.size.width { @@ -222,7 +241,7 @@ open class ZoomableContentGalleryItemNode: GalleryItemNode, UIScrollViewDelegate } override open func contentSize() -> CGSize? { - if let (_, contentNode) = self.zoomableContent { + if let (intrinsicSize, contentNode) = self.zoomableContent { let size = contentNode.view.convert(contentNode.bounds, to: self.view).size return CGSize(width: floor(size.width), height: floor(size.height)) } From 34deac51e32440284e5948d94a02ad131e1f430e Mon Sep 17 00:00:00 2001 From: Ali <> Date: Tue, 21 Apr 2020 22:27:17 +0400 Subject: [PATCH 05/12] Drop the call session if receivedCall returns an error [skip ci] --- .../TelegramCore/Sources/CallSessionManager.swift | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/submodules/TelegramCore/Sources/CallSessionManager.swift b/submodules/TelegramCore/Sources/CallSessionManager.swift index 301a47a4ee..3149687642 100644 --- a/submodules/TelegramCore/Sources/CallSessionManager.swift +++ b/submodules/TelegramCore/Sources/CallSessionManager.swift @@ -351,7 +351,15 @@ private final class CallSessionManagerContext { let internalId = CallSessionInternalId() let context = CallSessionContext(peerId: peerId, isOutgoing: false, state: .ringing(id: stableId, accessHash: accessHash, gAHash: gAHash, b: b)) self.contexts[internalId] = context - context.acknowledgeIncomingCallDisposable.set(self.network.request(Api.functions.phone.receivedCall(peer: .inputPhoneCall(id: stableId, accessHash: accessHash))).start()) + let queue = self.queue + context.acknowledgeIncomingCallDisposable.set(self.network.request(Api.functions.phone.receivedCall(peer: .inputPhoneCall(id: stableId, accessHash: accessHash))).start(error: { [weak self] _ in + queue.async { + guard let strongSelf = self else { + return + } + strongSelf.drop(internalId: internalId, reason: .disconnect, debugLog: .single(nil)) + } + })) self.contextIdByStableId[stableId] = internalId self.contextUpdated(internalId: internalId) self.ringingStatesUpdated() From eff534a99110041c9791c57874e3405950d34dc0 Mon Sep 17 00:00:00 2001 From: Ali <> Date: Tue, 21 Apr 2020 22:44:52 +0400 Subject: [PATCH 06/12] Allow editing messages in channels [skip ci] --- .../TelegramUI/Sources/ChatInterfaceStateContextMenus.swift | 1 + 1 file changed, 1 insertion(+) diff --git a/submodules/TelegramUI/Sources/ChatInterfaceStateContextMenus.swift b/submodules/TelegramUI/Sources/ChatInterfaceStateContextMenus.swift index b6a527a099..38630e8e75 100644 --- a/submodules/TelegramUI/Sources/ChatInterfaceStateContextMenus.swift +++ b/submodules/TelegramUI/Sources/ChatInterfaceStateContextMenus.swift @@ -56,6 +56,7 @@ private func canEditMessage(accountPeerId: PeerId, limitsConfiguration: LimitsCo switch peer.info { case .broadcast: if peer.hasPermission(.editAllMessages) || !message.flags.contains(.Incoming) { + unlimitedInterval = true hasEditRights = true } case .group: From fa463177f6da7f0728249316485381bdfc88ca01 Mon Sep 17 00:00:00 2001 From: Ali <> Date: Wed, 22 Apr 2020 00:00:08 +0400 Subject: [PATCH 07/12] Fix gallery --- .../ZoomableContentGalleryItemNode.swift | 88 ++++++++++++------- 1 file changed, 55 insertions(+), 33 deletions(-) diff --git a/submodules/GalleryUI/Sources/ZoomableContentGalleryItemNode.swift b/submodules/GalleryUI/Sources/ZoomableContentGalleryItemNode.swift index f505551bdc..2b265050e4 100644 --- a/submodules/GalleryUI/Sources/ZoomableContentGalleryItemNode.swift +++ b/submodules/GalleryUI/Sources/ZoomableContentGalleryItemNode.swift @@ -151,13 +151,15 @@ open class ZoomableContentGalleryItemNode: GalleryItemNode, UIScrollViewDelegate //self.scrollView.normalZoomScale = 1.0 self.scrollNode.view.zoomScale = 1.0 - self.scrollNode.view.contentSize = normalizedContentSize - - if !(contentNode.view is TilingView) { + if contentNode.view is TilingView { + contentNode.frame = CGRect(origin: CGPoint(), size: normalizedContentSize) + self.scrollNode.view.contentSize = normalizedContentSize contentNode.transform = CATransform3DIdentity + } else { + self.scrollNode.view.contentSize = contentSize + contentNode.transform = CATransform3DIdentity + contentNode.frame = CGRect(origin: CGPoint(), size: contentSize) } - - contentNode.frame = CGRect(origin: CGPoint(), size: normalizedContentSize) self.centerScrollViewContents(transition: transition) self.ignoreZoom = false @@ -176,34 +178,54 @@ open class ZoomableContentGalleryItemNode: GalleryItemNode, UIScrollViewDelegate return } - let normalizedContentSize = contentSize.fitted(boundsSize) + var minScale: CGFloat + var maxScale: CGFloat - let scaleWidth = boundsSize.width / normalizedContentSize.width - let scaleHeight = boundsSize.height / normalizedContentSize.height - var minScale = min(scaleWidth, scaleHeight) - minScale = 1.0 - - var maxScale = max(scaleWidth, scaleHeight) - maxScale = max(maxScale, minScale * 4.0) - - if (abs(maxScale - minScale) < 0.01) { - maxScale = minScale - } - - if !self.scrollNode.view.minimumZoomScale.isEqual(to: minScale) { - self.scrollNode.view.minimumZoomScale = minScale - } - - /*if !self.scrollView.normalZoomScale.isEqual(to: minScale) { - self.scrollView.normalZoomScale = minScale - }*/ - - if !self.scrollNode.view.maximumZoomScale.isEqual(to: maxScale) { - self.scrollNode.view.maximumZoomScale = maxScale - } - - if let contentView = contentNode.view as? TilingView { - contentView.setMaximumZoomScale(maxScale, normalizedSize: normalizedContentSize) + if contentNode.view is TilingView { + let normalizedContentSize = contentSize.fitted(boundsSize) + + let scaleWidth = boundsSize.width / normalizedContentSize.width + let scaleHeight = boundsSize.height / normalizedContentSize.height + minScale = min(scaleWidth, scaleHeight) + minScale = 1.0 + + maxScale = max(scaleWidth, scaleHeight) + maxScale = max(maxScale, minScale * 4.0) + + if (abs(maxScale - minScale) < 0.01) { + maxScale = minScale + } + + if !self.scrollNode.view.minimumZoomScale.isEqual(to: minScale) { + self.scrollNode.view.minimumZoomScale = minScale + } + + if !self.scrollNode.view.maximumZoomScale.isEqual(to: maxScale) { + self.scrollNode.view.maximumZoomScale = maxScale + } + + if let contentView = contentNode.view as? TilingView { + contentView.setMaximumZoomScale(maxScale, normalizedSize: normalizedContentSize) + } + } else { + let scaleWidth = boundsSize.width / contentSize.width + let scaleHeight = boundsSize.height / contentSize.height + let minScale = min(scaleWidth, scaleHeight) + + maxScale = max(scaleWidth, scaleHeight) + maxScale = max(maxScale, minScale * 3.0) + + if (abs(maxScale - minScale) < 0.01) { + maxScale = minScale + } + + if !self.scrollNode.view.minimumZoomScale.isEqual(to: minScale) { + self.scrollNode.view.minimumZoomScale = minScale + } + + if !self.scrollNode.view.maximumZoomScale.isEqual(to: maxScale) { + self.scrollNode.view.maximumZoomScale = maxScale + } } var contentFrame = contentNode.view.frame @@ -241,7 +263,7 @@ open class ZoomableContentGalleryItemNode: GalleryItemNode, UIScrollViewDelegate } override open func contentSize() -> CGSize? { - if let (intrinsicSize, contentNode) = self.zoomableContent { + if let (_, contentNode) = self.zoomableContent { let size = contentNode.view.convert(contentNode.bounds, to: self.view).size return CGSize(width: floor(size.width), height: floor(size.height)) } From 5acbd51bbe449d14c2806402c71d866000453824 Mon Sep 17 00:00:00 2001 From: Ali <> Date: Wed, 22 Apr 2020 13:08:52 +0400 Subject: [PATCH 08/12] Add more logging [skip ci] --- .../TelegramCore/Sources/PendingMessageManager.swift | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/submodules/TelegramCore/Sources/PendingMessageManager.swift b/submodules/TelegramCore/Sources/PendingMessageManager.swift index 9cb6459e60..f1dfd809d3 100644 --- a/submodules/TelegramCore/Sources/PendingMessageManager.swift +++ b/submodules/TelegramCore/Sources/PendingMessageManager.swift @@ -180,6 +180,10 @@ public final class PendingMessageManager { let removedMessageIds = self.pendingMessageIds.subtracting(messageIds) let removedSecretMessageIds = Set(removedMessageIds.filter({ $0.peerId.namespace == Namespaces.Peer.SecretChat })) + if !removedMessageIds.isEmpty { + Logger.shared.log("PendingMessageManager", "removed messages: \(removedMessageIds)") + } + var updateUploadingPeerIds = Set() var updateUploadingGroupIds = Set() for id in removedMessageIds { @@ -207,6 +211,7 @@ public final class PendingMessageManager { } if !addedMessageIds.isEmpty { + Logger.shared.log("PendingMessageManager", "added messages: \(addedMessageIds)") self.beginSendingMessages(Array(addedMessageIds).sorted()) } @@ -251,6 +256,8 @@ public final class PendingMessageManager { peersWithPendingMessages.insert(id.peerId) } + Logger.shared.log("PendingMessageManager", "pengine messages: \(self.pendingMessageIds)") + self._hasPendingMessages.set(peersWithPendingMessages) } } @@ -333,6 +340,8 @@ public final class PendingMessageManager { } } + Logger.shared.log("PendingMessageManager", "begin sending: \(ids)") + let disposable = MetaDisposable() let messages = self.postbox.messagesAtIds(ids) |> deliverOn(self.queue) @@ -346,6 +355,8 @@ public final class PendingMessageManager { if let strongSelf = self { assert(strongSelf.queue.isCurrent()) + Logger.shared.log("PendingMessageManager", "begin sending, continued: \(ids)") + for message in messages.filter({ !$0.flags.contains(.Sending) }).sorted(by: { $0.id < $1.id }) { guard let messageContext = strongSelf.messageContexts[message.id] else { continue From 210e47df003dec2b969cbedc7a7a144c6a7c84ea Mon Sep 17 00:00:00 2001 From: overtake <> Date: Wed, 22 Apr 2020 15:42:15 +0400 Subject: [PATCH 09/12] fix dialogs [skip ci] --- .../Sources/AccountStateManagementUtils.swift | 6 ++++++ submodules/TelegramCore/Sources/ApplyUpdateMessage.swift | 2 ++ submodules/TelegramCore/Sources/UpdateGroup.swift | 8 +++++--- 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/submodules/TelegramCore/Sources/AccountStateManagementUtils.swift b/submodules/TelegramCore/Sources/AccountStateManagementUtils.swift index f9dff4046a..f25fa4e3c2 100644 --- a/submodules/TelegramCore/Sources/AccountStateManagementUtils.swift +++ b/submodules/TelegramCore/Sources/AccountStateManagementUtils.swift @@ -109,6 +109,12 @@ private func peerIdsRequiringLocalChatStateFromUpdateGroups(_ groups: [UpdateGro for group in groups { peerIds.formUnion(peerIdsRequiringLocalChatStateFromUpdates(group.updates)) + switch group { + case let .ensurePeerHasLocalState(peerId): + peerIds.insert(peerId) + default: + break + } } return peerIds diff --git a/submodules/TelegramCore/Sources/ApplyUpdateMessage.swift b/submodules/TelegramCore/Sources/ApplyUpdateMessage.swift index 10e51ef71a..1b71864765 100644 --- a/submodules/TelegramCore/Sources/ApplyUpdateMessage.swift +++ b/submodules/TelegramCore/Sources/ApplyUpdateMessage.swift @@ -219,6 +219,7 @@ func applyUpdateMessage(postbox: Postbox, stateManager: AccountStateManager, mes } stateManager.addUpdates(result) + stateManager.addUpdateGroups([.ensurePeerHasLocalState(id: message.id.peerId)]) } } @@ -355,5 +356,6 @@ func applyUpdateGroupMessages(postbox: Postbox, stateManager: AccountStateManage transaction.addOrMoveToFirstPositionOrderedItemListItem(collectionId: Namespaces.OrderedItemList.CloudRecentGifs, item: OrderedItemListEntry(id: RecentMediaItemId(file.fileId).rawValue, contents: RecentMediaItem(file)), removeTailIfCountExceeds: 200) } stateManager.addUpdates(result) + stateManager.addUpdateGroups([.ensurePeerHasLocalState(id: messages[0].id.peerId)]) } } diff --git a/submodules/TelegramCore/Sources/UpdateGroup.swift b/submodules/TelegramCore/Sources/UpdateGroup.swift index 4613303c83..8145e9d2e9 100644 --- a/submodules/TelegramCore/Sources/UpdateGroup.swift +++ b/submodules/TelegramCore/Sources/UpdateGroup.swift @@ -1,5 +1,6 @@ import Foundation import TelegramApi +import Postbox enum UpdateGroup { case withPts(updates: [Api.Update], users: [Api.User], chats: [Api.Chat]) @@ -9,6 +10,7 @@ enum UpdateGroup { case reset case updatePts(pts: Int32, ptsCount: Int32) case updateChannelPts(channelId: Int32, pts: Int32, ptsCount: Int32) + case ensurePeerHasLocalState(id: PeerId) var updates: [Api.Update] { switch self { @@ -20,7 +22,7 @@ enum UpdateGroup { return updates case let .withSeq(updates, _, _, _, _): return updates - case .reset, .updatePts, .updateChannelPts: + case .reset, .updatePts, .updateChannelPts, .ensurePeerHasLocalState: return [] } } @@ -35,7 +37,7 @@ enum UpdateGroup { return users case let .withSeq(_, _, _, users, _): return users - case .reset, .updatePts, .updateChannelPts: + case .reset, .updatePts, .updateChannelPts, .ensurePeerHasLocalState: return [] } } @@ -50,7 +52,7 @@ enum UpdateGroup { return chats case let .withSeq(_, _, _, _, chats): return chats - case .reset, .updatePts, .updateChannelPts: + case .reset, .updatePts, .updateChannelPts, .ensurePeerHasLocalState: return [] } } From db989d534bd622e7293287dcf35d39cc208aed7d Mon Sep 17 00:00:00 2001 From: Ali <> Date: Wed, 22 Apr 2020 17:11:23 +0400 Subject: [PATCH 10/12] Add more logs [skip ci] --- submodules/TelegramCore/Sources/Account.swift | 1 + submodules/TelegramCore/Sources/PendingMessageManager.swift | 5 ++++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/submodules/TelegramCore/Sources/Account.swift b/submodules/TelegramCore/Sources/Account.swift index a209643aca..96c0cfd61a 100644 --- a/submodules/TelegramCore/Sources/Account.swift +++ b/submodules/TelegramCore/Sources/Account.swift @@ -1019,6 +1019,7 @@ public class Account { self.managedServiceViewsDisposable.set(serviceTasksMaster.start()) let pendingMessageManager = self.pendingMessageManager + Logger.shared.log("Account", "Begin watching unsent message ids") self.managedOperationsDisposable.add(postbox.unsentMessageIdsView().start(next: { [weak pendingMessageManager] view in pendingMessageManager?.updatePendingMessageIds(view.ids) })) diff --git a/submodules/TelegramCore/Sources/PendingMessageManager.swift b/submodules/TelegramCore/Sources/PendingMessageManager.swift index f1dfd809d3..eebe604e11 100644 --- a/submodules/TelegramCore/Sources/PendingMessageManager.swift +++ b/submodules/TelegramCore/Sources/PendingMessageManager.swift @@ -160,6 +160,7 @@ public final class PendingMessageManager { var transformOutgoingMessageMedia: TransformOutgoingMessageMedia? init(network: Network, postbox: Postbox, accountPeerId: PeerId, auxiliaryMethods: AccountAuxiliaryMethods, stateManager: AccountStateManager, localInputActivityManager: PeerInputActivityManager, messageMediaPreuploadManager: MessageMediaPreuploadManager, revalidationContext: MediaReferenceRevalidationContext) { + Logger.shared.log("PendingMessageManager", "create instance") self.network = network self.postbox = postbox self.accountPeerId = accountPeerId @@ -176,6 +177,8 @@ public final class PendingMessageManager { func updatePendingMessageIds(_ messageIds: Set) { self.queue.async { + Logger.shared.log("PendingMessageManager", "update: \(messageIds)") + let addedMessageIds = messageIds.subtracting(self.pendingMessageIds) let removedMessageIds = self.pendingMessageIds.subtracting(messageIds) let removedSecretMessageIds = Set(removedMessageIds.filter({ $0.peerId.namespace == Namespaces.Peer.SecretChat })) @@ -256,7 +259,7 @@ public final class PendingMessageManager { peersWithPendingMessages.insert(id.peerId) } - Logger.shared.log("PendingMessageManager", "pengine messages: \(self.pendingMessageIds)") + Logger.shared.log("PendingMessageManager", "pending messages: \(self.pendingMessageIds)") self._hasPendingMessages.set(peersWithPendingMessages) } From 4a045feb2fecfee79ab70041f49ef3a7a60de1fa Mon Sep 17 00:00:00 2001 From: Ali <> Date: Wed, 22 Apr 2020 18:16:42 +0400 Subject: [PATCH 11/12] Add even more logs [skip ci] --- build-system/xcode_version | 2 +- submodules/Postbox/Sources/Postbox.swift | 1 + submodules/Postbox/Sources/UnsentMessageHistoryView.swift | 2 ++ submodules/Postbox/Sources/ViewTracker.swift | 1 + 4 files changed, 5 insertions(+), 1 deletion(-) diff --git a/build-system/xcode_version b/build-system/xcode_version index 1c7134df6c..a6e5b12f92 100644 --- a/build-system/xcode_version +++ b/build-system/xcode_version @@ -1 +1 @@ -11.4 +11.4.1 diff --git a/submodules/Postbox/Sources/Postbox.swift b/submodules/Postbox/Sources/Postbox.swift index 16d2f01690..f1fa88e85b 100644 --- a/submodules/Postbox/Sources/Postbox.swift +++ b/submodules/Postbox/Sources/Postbox.swift @@ -2877,6 +2877,7 @@ public final class Postbox { let disposable = MetaDisposable() self.queue.async { disposable.set(self.viewTracker.unsentMessageIdsViewSignal().start(next: { view in + postboxLog("unsentMessageIdsView contents: \(view.ids)") subscriber.putNext(view) })) } diff --git a/submodules/Postbox/Sources/UnsentMessageHistoryView.swift b/submodules/Postbox/Sources/UnsentMessageHistoryView.swift index 6769deb967..f0cc140903 100644 --- a/submodules/Postbox/Sources/UnsentMessageHistoryView.swift +++ b/submodules/Postbox/Sources/UnsentMessageHistoryView.swift @@ -9,6 +9,7 @@ final class UnsentMessageHistoryView { func refreshDueToExternalTransaction(fetchUnsentMessageIds: () -> [MessageId]) -> Bool { let ids = Set(fetchUnsentMessageIds()) + postboxLog("UnsentMessageHistoryView: refreshDueToExternalTransaction: \(ids)") if ids != self.ids { self.ids = ids return true @@ -20,6 +21,7 @@ final class UnsentMessageHistoryView { func replay(_ operations: [IntermediateMessageHistoryUnsentOperation]) -> Bool { var updated = false for operation in operations { + postboxLog("UnsentMessageHistoryView: operation: \(operation)") switch operation { case let .Insert(id): if !self.ids.contains(id) { diff --git a/submodules/Postbox/Sources/ViewTracker.swift b/submodules/Postbox/Sources/ViewTracker.swift index 14483b6760..6b7de365ee 100644 --- a/submodules/Postbox/Sources/ViewTracker.swift +++ b/submodules/Postbox/Sources/ViewTracker.swift @@ -546,6 +546,7 @@ final class ViewTracker { return Signal { subscriber in let disposable = MetaDisposable() self.queue.async { + postboxLog("unsentMessageIdsViewSignal started with \(self.unsentMessageView.ids)") subscriber.putNext(UnsentMessageIdsView(self.unsentMessageView.ids)) let pipe = ValuePipe() From fb07f06a2625a302e321d2c85789931e13eee48f Mon Sep 17 00:00:00 2001 From: Ali <> Date: Wed, 22 Apr 2020 21:37:41 +0400 Subject: [PATCH 12/12] State management fixes --- .../Sources/InteractivePhoneFormatter.swift | 7 +- .../Sources/AccountIntermediateState.swift | 44 +++-- .../Sources/AccountStateManagementUtils.swift | 143 ++++++++++----- .../Sources/ChatListFiltering.swift | 13 +- .../TelegramCore/Sources/FetchChatList.swift | 24 +-- submodules/TelegramCore/Sources/Holes.swift | 12 +- .../ManagedSynchronizePeerReadStates.swift | 166 ++++++++++++------ ...agedSynchronizePinnedChatsOperations.swift | 16 +- .../ChatInterfaceStateContextMenus.swift | 14 +- 9 files changed, 292 insertions(+), 147 deletions(-) diff --git a/submodules/PhoneNumberFormat/Sources/InteractivePhoneFormatter.swift b/submodules/PhoneNumberFormat/Sources/InteractivePhoneFormatter.swift index 24405329bb..ff36a6587e 100644 --- a/submodules/PhoneNumberFormat/Sources/InteractivePhoneFormatter.swift +++ b/submodules/PhoneNumberFormat/Sources/InteractivePhoneFormatter.swift @@ -10,6 +10,11 @@ public final class InteractivePhoneFormatter { public func updateText(_ text: String) -> (String?, String) { self.formatter.clear() let string = self.formatter.inputString(text) - return (self.formatter.regionPrefix, string ?? "") + + var regionPrefix = self.formatter.regionPrefix + if let string = string, string.hasPrefix("+383") { + regionPrefix = "+383" + } + return (regionPrefix, string ?? "") } } diff --git a/submodules/TelegramCore/Sources/AccountIntermediateState.swift b/submodules/TelegramCore/Sources/AccountIntermediateState.swift index d3434c8689..bf19ff8002 100644 --- a/submodules/TelegramCore/Sources/AccountIntermediateState.swift +++ b/submodules/TelegramCore/Sources/AccountIntermediateState.swift @@ -10,20 +10,24 @@ struct PeerChatInfo { var notificationSettings: PeerNotificationSettings } +struct AccountStateChannelState: Equatable { + var pts: Int32 +} + final class AccountInitialState { let state: AuthorizedAccountState.State let peerIds: Set - let chatStates: [PeerId: PeerChatState] + let channelStates: [PeerId: AccountStateChannelState] let peerChatInfos: [PeerId: PeerChatInfo] let peerIdsRequiringLocalChatState: Set let locallyGeneratedMessageTimestamps: [PeerId: [(MessageId.Namespace, Int32)]] let cloudReadStates: [PeerId: PeerReadState] let channelsToPollExplicitely: Set - init(state: AuthorizedAccountState.State, peerIds: Set, peerIdsRequiringLocalChatState: Set, chatStates: [PeerId: PeerChatState], peerChatInfos: [PeerId: PeerChatInfo], locallyGeneratedMessageTimestamps: [PeerId: [(MessageId.Namespace, Int32)]], cloudReadStates: [PeerId: PeerReadState], channelsToPollExplicitely: Set) { + init(state: AuthorizedAccountState.State, peerIds: Set, peerIdsRequiringLocalChatState: Set, channelStates: [PeerId: AccountStateChannelState], peerChatInfos: [PeerId: PeerChatInfo], locallyGeneratedMessageTimestamps: [PeerId: [(MessageId.Namespace, Int32)]], cloudReadStates: [PeerId: PeerReadState], channelsToPollExplicitely: Set) { self.state = state self.peerIds = peerIds - self.chatStates = chatStates + self.channelStates = channelStates self.peerIdsRequiringLocalChatState = peerIdsRequiringLocalChatState self.peerChatInfos = peerChatInfos self.locallyGeneratedMessageTimestamps = locallyGeneratedMessageTimestamps @@ -72,7 +76,9 @@ enum AccountStateMutationOperation { case ResetMessageTagSummary(PeerId, MessageId.Namespace, Int32, MessageHistoryTagNamespaceCountValidityRange) case ReadGroupFeedInbox(PeerGroupId, MessageIndex) case UpdateState(AuthorizedAccountState.State) - case UpdateChannelState(PeerId, ChannelState) + case UpdateChannelState(PeerId, Int32) + case UpdateChannelInvalidationPts(PeerId, Int32) + case UpdateChannelSynchronizedUntilMessage(PeerId, MessageId.Id) case UpdateNotificationSettings(AccountStateNotificationSettingsSubject, PeerNotificationSettings) case UpdateGlobalNotificationSettings(AccountStateGlobalNotificationSettingsSubject, MessageNotificationSettings) case MergeApiChats([Api.Chat]) @@ -110,7 +116,7 @@ struct AccountMutableState { var state: AuthorizedAccountState.State var peers: [PeerId: Peer] - var chatStates: [PeerId: PeerChatState] + var channelStates: [PeerId: AccountStateChannelState] var peerChatInfos: [PeerId: PeerChatInfo] var referencedMessageIds: Set var storedMessages: Set @@ -139,7 +145,7 @@ struct AccountMutableState { self.referencedMessageIds = initialReferencedMessageIds self.storedMessages = initialStoredMessages self.readInboxMaxIds = initialReadInboxMaxIds - self.chatStates = initialState.chatStates + self.channelStates = initialState.channelStates self.peerChatInfos = initialState.peerChatInfos self.storedMessagesByPeerIdAndTimestamp = storedMessagesByPeerIdAndTimestamp self.branchOperationIndex = 0 @@ -147,12 +153,12 @@ struct AccountMutableState { self.updatedOutgoingUniqueMessageIds = [:] } - init(initialState: AccountInitialState, operations: [AccountStateMutationOperation], state: AuthorizedAccountState.State, peers: [PeerId: Peer], chatStates: [PeerId: PeerChatState], peerChatInfos: [PeerId: PeerChatInfo], referencedMessageIds: Set, storedMessages: Set, readInboxMaxIds: [PeerId: MessageId], storedMessagesByPeerIdAndTimestamp: [PeerId: Set], namespacesWithHolesFromPreviousState: [PeerId: Set], updatedOutgoingUniqueMessageIds: [Int64: Int32], displayAlerts: [(text: String, isDropAuth: Bool)], branchOperationIndex: Int) { + init(initialState: AccountInitialState, operations: [AccountStateMutationOperation], state: AuthorizedAccountState.State, peers: [PeerId: Peer], channelStates: [PeerId: AccountStateChannelState], peerChatInfos: [PeerId: PeerChatInfo], referencedMessageIds: Set, storedMessages: Set, readInboxMaxIds: [PeerId: MessageId], storedMessagesByPeerIdAndTimestamp: [PeerId: Set], namespacesWithHolesFromPreviousState: [PeerId: Set], updatedOutgoingUniqueMessageIds: [Int64: Int32], displayAlerts: [(text: String, isDropAuth: Bool)], branchOperationIndex: Int) { self.initialState = initialState self.operations = operations self.state = state self.peers = peers - self.chatStates = chatStates + self.channelStates = channelStates self.referencedMessageIds = referencedMessageIds self.storedMessages = storedMessages self.peerChatInfos = peerChatInfos @@ -165,7 +171,7 @@ struct AccountMutableState { } func branch() -> AccountMutableState { - return AccountMutableState(initialState: self.initialState, operations: self.operations, state: self.state, peers: self.peers, chatStates: self.chatStates, peerChatInfos: self.peerChatInfos, referencedMessageIds: self.referencedMessageIds, storedMessages: self.storedMessages, readInboxMaxIds: self.readInboxMaxIds, storedMessagesByPeerIdAndTimestamp: self.storedMessagesByPeerIdAndTimestamp, namespacesWithHolesFromPreviousState: self.namespacesWithHolesFromPreviousState, updatedOutgoingUniqueMessageIds: self.updatedOutgoingUniqueMessageIds, displayAlerts: self.displayAlerts, branchOperationIndex: self.operations.count) + return AccountMutableState(initialState: self.initialState, operations: self.operations, state: self.state, peers: self.peers, channelStates: self.channelStates, peerChatInfos: self.peerChatInfos, referencedMessageIds: self.referencedMessageIds, storedMessages: self.storedMessages, readInboxMaxIds: self.readInboxMaxIds, storedMessagesByPeerIdAndTimestamp: self.storedMessagesByPeerIdAndTimestamp, namespacesWithHolesFromPreviousState: self.namespacesWithHolesFromPreviousState, updatedOutgoingUniqueMessageIds: self.updatedOutgoingUniqueMessageIds, displayAlerts: self.displayAlerts, branchOperationIndex: self.operations.count) } mutating func merge(_ other: AccountMutableState) { @@ -269,8 +275,16 @@ struct AccountMutableState { self.addOperation(.UpdateState(state)) } - mutating func updateChannelState(_ peerId: PeerId, state: ChannelState) { - self.addOperation(.UpdateChannelState(peerId, state)) + mutating func updateChannelState(_ peerId: PeerId, pts: Int32) { + self.addOperation(.UpdateChannelState(peerId, pts)) + } + + mutating func updateChannelInvalidationPts(_ peerId: PeerId, invalidationPts: Int32) { + self.addOperation(.UpdateChannelInvalidationPts(peerId, invalidationPts)) + } + + mutating func updateChannelSynchronizedUntilMessage(_ peerId: PeerId, id: MessageId.Id) { + self.addOperation(.UpdateChannelSynchronizedUntilMessage(peerId, id)) } mutating func updateNotificationSettings(_ subject: AccountStateNotificationSettingsSubject, notificationSettings: PeerNotificationSettings) { @@ -464,8 +478,12 @@ struct AccountMutableState { } case let .UpdateState(state): self.state = state - case let .UpdateChannelState(peerId, channelState): - self.chatStates[peerId] = channelState + case let .UpdateChannelState(peerId, pts): + self.channelStates[peerId] = AccountStateChannelState(pts: pts) + case .UpdateChannelInvalidationPts: + break + case .UpdateChannelSynchronizedUntilMessage: + break case let .UpdateNotificationSettings(subject, notificationSettings): if case let .peer(peerId) = subject { if var currentInfo = self.peerChatInfos[peerId] { diff --git a/submodules/TelegramCore/Sources/AccountStateManagementUtils.swift b/submodules/TelegramCore/Sources/AccountStateManagementUtils.swift index f25fa4e3c2..56b3502092 100644 --- a/submodules/TelegramCore/Sources/AccountStateManagementUtils.swift +++ b/submodules/TelegramCore/Sources/AccountStateManagementUtils.swift @@ -356,7 +356,7 @@ private func locallyGeneratedMessageTimestampsFromDifference(_ difference: Api.u private func initialStateWithPeerIds(_ transaction: Transaction, peerIds: Set, activeChannelIds: Set, associatedMessageIds: Set, peerIdsRequiringLocalChatState: Set, locallyGeneratedMessageTimestamps: [PeerId: [(MessageId.Namespace, Int32)]]) -> AccountMutableState { var peers: [PeerId: Peer] = [:] - var chatStates: [PeerId: PeerChatState] = [:] + var channelStates: [PeerId: AccountStateChannelState] = [:] var channelsToPollExplicitely = Set() @@ -367,11 +367,11 @@ private func initialStateWithPeerIds(_ transaction: Transaction, peerIds: Set Signal { @@ -772,7 +772,7 @@ private func finalStateWithUpdatesAndServerTime(postbox: Postbox, network: Netwo case let .updateChannelTooLong(_, channelId, channelPts): let peerId = PeerId(namespace: Namespaces.Peer.CloudChannel, id: channelId) if !channelsToPoll.contains(peerId) { - if let channelPts = channelPts, let channelState = state.chatStates[peerId] as? ChannelState, channelState.pts >= channelPts { + if let channelPts = channelPts, let channelState = state.channelStates[peerId], channelState.pts >= channelPts { Logger.shared.log("State", "channel \(peerId) (\((updatedState.peers[peerId] as? TelegramChannel)?.title ?? "nil")) skip updateChannelTooLong by pts") } else { channelsToPoll.insert(peerId) @@ -780,12 +780,12 @@ private func finalStateWithUpdatesAndServerTime(postbox: Postbox, network: Netwo } case let .updateDeleteChannelMessages(channelId, messages, pts: pts, ptsCount): let peerId = PeerId(namespace: Namespaces.Peer.CloudChannel, id: channelId) - if let previousState = updatedState.chatStates[peerId] as? ChannelState { + if let previousState = updatedState.channelStates[peerId] { if previousState.pts >= pts { Logger.shared.log("State", "channel \(peerId) (\((updatedState.peers[peerId] as? TelegramChannel)?.title ?? "nil")) skip old delete update") } else if previousState.pts + ptsCount == pts { updatedState.deleteMessages(messages.map({ MessageId(peerId: peerId, namespace: Namespaces.Message.Cloud, id: $0) })) - updatedState.updateChannelState(peerId, state: previousState.withUpdatedPts(pts)) + updatedState.updateChannelState(peerId, pts: pts) } else { if !channelsToPoll.contains(peerId) { Logger.shared.log("State", "channel \(peerId) (\((updatedState.peers[peerId] as? TelegramChannel)?.title ?? "nil")) delete pts hole") @@ -802,7 +802,7 @@ private func finalStateWithUpdatesAndServerTime(postbox: Postbox, network: Netwo case let .updateEditChannelMessage(apiMessage, pts, ptsCount): if let message = StoreMessage(apiMessage: apiMessage), case let .Id(messageId) = message.id { let peerId = messageId.peerId - if let previousState = updatedState.chatStates[peerId] as? ChannelState { + if let previousState = updatedState.channelStates[peerId] { if previousState.pts >= pts { Logger.shared.log("State", "channel \(peerId) (\((updatedState.peers[peerId] as? TelegramChannel)?.title ?? "nil")) skip old edit update") } else if previousState.pts + ptsCount == pts { @@ -814,7 +814,7 @@ private func finalStateWithUpdatesAndServerTime(postbox: Postbox, network: Netwo var attributes = message.attributes attributes.append(ChannelMessageStateVersionAttribute(pts: pts)) updatedState.editMessage(messageId, message: message.withUpdatedAttributes(attributes)) - updatedState.updateChannelState(peerId, state: previousState.withUpdatedPts(pts)) + updatedState.updateChannelState(peerId, pts: pts) } else { if !channelsToPoll.contains(peerId) { Logger.shared.log("State", "channel \(peerId) (\((updatedState.peers[peerId] as? TelegramChannel)?.title ?? "nil")) edit message pts hole") @@ -833,7 +833,7 @@ private func finalStateWithUpdatesAndServerTime(postbox: Postbox, network: Netwo } case let .updateChannelWebPage(channelId, apiWebpage, pts, ptsCount): let peerId = PeerId(namespace: Namespaces.Peer.CloudChannel, id: channelId) - if let previousState = updatedState.chatStates[peerId] as? ChannelState { + if let previousState = updatedState.channelStates[peerId] { if previousState.pts >= pts { } else if previousState.pts + ptsCount == pts { switch apiWebpage { @@ -845,7 +845,7 @@ private func finalStateWithUpdatesAndServerTime(postbox: Postbox, network: Netwo } } - updatedState.updateChannelState(peerId, state: previousState.withUpdatedPts(pts)) + updatedState.updateChannelState(peerId, pts: pts) } else { if !channelsToPoll.contains(peerId) { Logger.shared.log("State", "channel \(peerId) (\((updatedState.peers[peerId] as? TelegramChannel)?.title ?? "nil")) updateWebPage pts hole") @@ -880,7 +880,7 @@ private func finalStateWithUpdatesAndServerTime(postbox: Postbox, network: Netwo } case let .updateNewChannelMessage(apiMessage, pts, ptsCount): if let message = StoreMessage(apiMessage: apiMessage) { - if let previousState = updatedState.chatStates[message.id.peerId] as? ChannelState { + if let previousState = updatedState.channelStates[message.id.peerId] { if previousState.pts >= pts { let messageText: String if Logger.shared.redactSensitiveData { @@ -898,7 +898,10 @@ private func finalStateWithUpdatesAndServerTime(postbox: Postbox, network: Netwo var attributes = message.attributes attributes.append(ChannelMessageStateVersionAttribute(pts: pts)) updatedState.addMessages([message.withUpdatedAttributes(attributes)], location: .UpperHistoryBlock) - updatedState.updateChannelState(message.id.peerId, state: previousState.withUpdatedPts(pts)) + updatedState.updateChannelState(message.id.peerId, pts: pts) + if case let .Id(id) = message.id { + updatedState.updateChannelSynchronizedUntilMessage(id.peerId, id: id.id) + } } else { if !channelsToPoll.contains(message.id.peerId) { Logger.shared.log("State", "channel \(message.id.peerId) (\((updatedState.peers[message.id.peerId] as? TelegramChannel)?.title ?? "nil")) message pts hole") @@ -1587,9 +1590,9 @@ private func resolveMissingPeerChatInfos(network: Network, state: AccountMutable func keepPollingChannel(postbox: Postbox, network: Network, peerId: PeerId, stateManager: AccountStateManager) -> Signal { return postbox.transaction { transaction -> Signal in if let accountState = (transaction.getState() as? AuthorizedAccountState)?.state, let peer = transaction.getPeer(peerId) { - var chatStates: [PeerId: PeerChatState] = [:] + var channelStates: [PeerId: AccountStateChannelState] = [:] if let channelState = transaction.getPeerChatState(peerId) as? ChannelState { - chatStates[peerId] = channelState + channelStates[peerId] = AccountStateChannelState(pts: channelState.pts) } let initialPeers: [PeerId: Peer] = [peerId: peer] var peerChatInfos: [PeerId: PeerChatInfo] = [:] @@ -1606,7 +1609,7 @@ func keepPollingChannel(postbox: Postbox, network: Network, peerId: PeerId, stat peerChatInfos[peerId] = PeerChatInfo(notificationSettings: notificationSettings) } } - let initialState = AccountMutableState(initialState: AccountInitialState(state: accountState, peerIds: Set(), peerIdsRequiringLocalChatState: Set(), chatStates: chatStates, peerChatInfos: peerChatInfos, locallyGeneratedMessageTimestamps: [:], cloudReadStates: [:], channelsToPollExplicitely: Set()), initialPeers: initialPeers, initialReferencedMessageIds: Set(), initialStoredMessages: Set(), initialReadInboxMaxIds: [:], storedMessagesByPeerIdAndTimestamp: [:]) + let initialState = AccountMutableState(initialState: AccountInitialState(state: accountState, peerIds: Set(), peerIdsRequiringLocalChatState: Set(), channelStates: channelStates, peerChatInfos: peerChatInfos, locallyGeneratedMessageTimestamps: [:], cloudReadStates: [:], channelsToPollExplicitely: Set()), initialPeers: initialPeers, initialReferencedMessageIds: Set(), initialStoredMessages: Set(), initialReadInboxMaxIds: [:], storedMessagesByPeerIdAndTimestamp: [:]) return pollChannel(network: network, peer: peer, state: initialState) |> mapToSignal { (finalState, _, timeout) -> Signal in return resolveAssociatedMessages(network: network, state: finalState) @@ -1657,7 +1660,9 @@ private func resetChannels(network: Network, peers: [Peer], state: AccountMutabl var storeMessages: [StoreMessage] = [] var readStates: [PeerId: [MessageId.Namespace: PeerReadState]] = [:] var mentionTagSummaries: [PeerId: MessageHistoryTagNamespaceSummary] = [:] - var channelStates: [PeerId: ChannelState] = [:] + var channelStates: [PeerId: AccountStateChannelState] = [:] + var invalidateChannelStates: [PeerId: Int32] = [:] + var channelSynchronizedUntilMessage: [PeerId: MessageId.Id] = [:] var notificationSettings: [PeerId: PeerNotificationSettings] = [:] if let result = result { @@ -1714,7 +1719,8 @@ private func resetChannels(network: Network, peers: [Peer], state: AccountMutabl } if let apiChannelPts = apiChannelPts { - channelStates[peerId] = ChannelState(pts: apiChannelPts, invalidatedPts: apiChannelPts, synchronizedUntilMessageId: nil) + channelStates[peerId] = AccountStateChannelState(pts: apiChannelPts) + invalidateChannelStates[peerId] = apiChannelPts } notificationSettings[peerId] = TelegramPeerNotificationSettings(apiSettings: apiNotificationSettings) @@ -1744,6 +1750,7 @@ private func resetChannels(network: Network, peers: [Peer], state: AccountMutabl for message in storeMessages { if case let .Id(id) = message.id, id.namespace == Namespaces.Message.Cloud { updatedState.setNeedsHoleFromPreviousState(peerId: id.peerId, namespace: id.namespace) + channelSynchronizedUntilMessage[id.peerId] = id.id } } @@ -1766,7 +1773,13 @@ private func resetChannels(network: Network, peers: [Peer], state: AccountMutabl } for (peerId, channelState) in channelStates { - updatedState.updateChannelState(peerId, state: channelState) + updatedState.updateChannelState(peerId, pts: channelState.pts) + } + for (peerId, pts) in invalidateChannelStates { + updatedState.updateChannelInvalidationPts(peerId, invalidationPts: pts) + } + for (peerId, id) in channelSynchronizedUntilMessage { + updatedState.updateChannelSynchronizedUntilMessage(peerId, id: id) } for (peerId, settings) in notificationSettings { @@ -1792,7 +1805,7 @@ private func pollChannel(network: Network, peer: Peer, state: AccountMutableStat #endif let pollPts: Int32 - if let channelState = state.chatStates[peer.id] as? ChannelState { + if let channelState = state.channelStates[peer.id] { pollPts = channelState.pts } else { pollPts = 1 @@ -1814,13 +1827,13 @@ private func pollChannel(network: Network, peer: Peer, state: AccountMutableStat switch difference { case let .channelDifference(_, pts, timeout, newMessages, otherUpdates, chats, users): apiTimeout = timeout - let channelState: ChannelState - if let previousState = updatedState.chatStates[peer.id] as? ChannelState { - channelState = previousState.withUpdatedPts(pts) + let channelPts: Int32 + if let _ = updatedState.channelStates[peer.id] { + channelPts = pts } else { - channelState = ChannelState(pts: pts, invalidatedPts: nil, synchronizedUntilMessageId: nil) + channelPts = pts } - updatedState.updateChannelState(peer.id, state: channelState) + updatedState.updateChannelState(peer.id, pts: channelPts) updatedState.mergeChats(chats) updatedState.mergeUsers(users) @@ -1833,6 +1846,9 @@ private func pollChannel(network: Network, peer: Peer, state: AccountMutableStat } } updatedState.addMessages([message], location: .UpperHistoryBlock) + if case let .Id(id) = message.id { + updatedState.updateChannelSynchronizedUntilMessage(id.peerId, id: id.id) + } } } for update in otherUpdates { @@ -1895,13 +1911,13 @@ private func pollChannel(network: Network, peer: Peer, state: AccountMutableStat case let .channelDifferenceEmpty(_, pts, timeout): apiTimeout = timeout - let channelState: ChannelState - if let previousState = updatedState.chatStates[peer.id] as? ChannelState { - channelState = previousState.withUpdatedPts(pts) + let channelPts: Int32 + if let previousState = updatedState.channelStates[peer.id] { + channelPts = pts } else { - channelState = ChannelState(pts: pts, invalidatedPts: nil, synchronizedUntilMessageId: nil) + channelPts = pts } - updatedState.updateChannelState(peer.id, state: channelState) + updatedState.updateChannelState(peer.id, pts: channelPts) case let .channelDifferenceTooLong(_, timeout, dialog, messages, chats, users): apiTimeout = timeout @@ -1917,8 +1933,8 @@ private func pollChannel(network: Network, peer: Peer, state: AccountMutableStat } if let (peer, pts, topMessage, readInboxMaxId, readOutboxMaxId, unreadCount, unreadMentionsCount) = parameters { - let channelState = ChannelState(pts: pts, invalidatedPts: pts, synchronizedUntilMessageId: nil) - updatedState.updateChannelState(peer.peerId, state: channelState) + updatedState.updateChannelState(peer.peerId, pts: pts) + updatedState.updateChannelInvalidationPts(peer.peerId, invalidationPts: pts) updatedState.mergeChats(chats) updatedState.mergeUsers(users) @@ -1936,6 +1952,7 @@ private func pollChannel(network: Network, peer: Peer, state: AccountMutableStat let location: AddMessagesLocation if case let .Id(id) = message.id, id.id == topMessage { location = .UpperHistoryBlock + updatedState.updateChannelSynchronizedUntilMessage(id.peerId, id: id.id) } else { location = .Random } @@ -2007,9 +2024,9 @@ private func verifyTransaction(_ transaction: Transaction, finalState: AccountMu for peerId in channelsWithUpdatedStates { let currentState = transaction.getPeerChatState(peerId) var previousStateMatches = false - let previousState = finalState.initialState.chatStates[peerId] as? ChannelState - if let currentState = currentState, let previousState = previousState { - if currentState.equals(previousState) { + let previousState = finalState.initialState.channelStates[peerId] + if let currentState = currentState as? ChannelState, let previousState = previousState { + if currentState.pts == previousState.pts { previousStateMatches = true } } else if currentState == nil && previousState == nil { @@ -2048,7 +2065,9 @@ private func optimizedOperations(_ operations: [AccountStateMutationOperation]) var result: [AccountStateMutationOperation] = [] var updatedState: AuthorizedAccountState.State? - var updatedChannelStates: [PeerId: ChannelState] = [:] + var updatedChannelStates: [PeerId: AccountStateChannelState] = [:] + var invalidateChannelPts: [PeerId: Int32] = [:] + var updateChannelSynchronizedUntilMessage: [PeerId: MessageId.Id] = [:] var currentAddMessages: OptimizeAddMessagesState? var currentAddScheduledMessages: OptimizeAddMessagesState? @@ -2065,8 +2084,12 @@ private func optimizedOperations(_ operations: [AccountStateMutationOperation]) result.append(operation) case let .UpdateState(state): updatedState = state - case let .UpdateChannelState(peerId, state): - updatedChannelStates[peerId] = state + case let .UpdateChannelState(peerId, pts): + updatedChannelStates[peerId] = AccountStateChannelState(pts: pts) + case let .UpdateChannelInvalidationPts(peerId, pts): + invalidateChannelPts[peerId] = pts + case let .UpdateChannelSynchronizedUntilMessage(peerId, id): + updateChannelSynchronizedUntilMessage[peerId] = id case let .AddMessages(messages, location): if let currentAddMessages = currentAddMessages, currentAddMessages.location == location { currentAddMessages.messages.append(contentsOf: messages) @@ -2097,7 +2120,15 @@ private func optimizedOperations(_ operations: [AccountStateMutationOperation]) } for (peerId, state) in updatedChannelStates { - result.append(.UpdateChannelState(peerId, state)) + result.append(.UpdateChannelState(peerId, state.pts)) + } + + for (peerId, pts) in invalidateChannelPts { + result.append(.UpdateChannelInvalidationPts(peerId, pts)) + } + + for (peerId, id) in updateChannelSynchronizedUntilMessage { + result.append(.UpdateChannelSynchronizedUntilMessage(peerId, id)) } return result @@ -2144,8 +2175,18 @@ func replayFinalState(accountManager: AccountManager, postbox: Postbox, accountP for (peerId, namespaces) in finalState.state.namespacesWithHolesFromPreviousState { for namespace in namespaces { - if let id = transaction.getTopPeerMessageId(peerId: peerId, namespace: namespace) { - holesFromPreviousStateMessageIds.append(MessageId(peerId: id.peerId, namespace: id.namespace, id: id.id + 1)) + var topId: Int32? + if namespace == Namespaces.Message.Cloud, let channelState = transaction.getPeerChatState(peerId) as? ChannelState { + if let synchronizedUntilMessageId = channelState.synchronizedUntilMessageId { + topId = synchronizedUntilMessageId + 1 + } + } + if topId == nil { + topId = transaction.getTopPeerMessageId(peerId: peerId, namespace: namespace)?.id + } + + if let id = topId { + holesFromPreviousStateMessageIds.append(MessageId(peerId: peerId, namespace: namespace, id: id + 1)) } else { holesFromPreviousStateMessageIds.append(MessageId(peerId: peerId, namespace: namespace, id: 1)) } @@ -2494,9 +2535,21 @@ func replayFinalState(accountManager: AccountManager, postbox: Postbox, accountP let currentState = transaction.getState() as! AuthorizedAccountState transaction.setState(currentState.changedState(state)) Logger.shared.log("State", "apply state \(state)") - case let .UpdateChannelState(peerId, channelState): - transaction.setPeerChatState(peerId, state: channelState) - Logger.shared.log("State", "apply channel state \(peerId): \(channelState)") + case let .UpdateChannelState(peerId, pts): + var state = (transaction.getPeerChatState(peerId) as? ChannelState) ?? ChannelState(pts: pts, invalidatedPts: nil, synchronizedUntilMessageId: nil) + state = state.withUpdatedPts(pts) + transaction.setPeerChatState(peerId, state: state) + Logger.shared.log("State", "apply channel state \(peerId): \(state)") + case let .UpdateChannelInvalidationPts(peerId, pts): + var state = (transaction.getPeerChatState(peerId) as? ChannelState) ?? ChannelState(pts: 0, invalidatedPts: pts, synchronizedUntilMessageId: nil) + state = state.withUpdatedInvalidatedPts(pts) + transaction.setPeerChatState(peerId, state: state) + Logger.shared.log("State", "apply channel invalidation pts \(peerId): \(state)") + case let .UpdateChannelSynchronizedUntilMessage(peerId, id): + var state = (transaction.getPeerChatState(peerId) as? ChannelState) ?? ChannelState(pts: 0, invalidatedPts: nil, synchronizedUntilMessageId: id) + state = state.withUpdatedSynchronizedUntilMessageId(id) + transaction.setPeerChatState(peerId, state: state) + Logger.shared.log("State", "apply channel synchronized until message \(peerId): \(state)") case let .UpdateNotificationSettings(subject, notificationSettings): switch subject { case let .peer(peerId): diff --git a/submodules/TelegramCore/Sources/ChatListFiltering.swift b/submodules/TelegramCore/Sources/ChatListFiltering.swift index 0cc46fd73e..094ad569fc 100644 --- a/submodules/TelegramCore/Sources/ChatListFiltering.swift +++ b/submodules/TelegramCore/Sources/ChatListFiltering.swift @@ -564,7 +564,7 @@ private func loadAndStorePeerChatInfos(accountPeerId: PeerId, postbox: Postbox, var peers: [Peer] = [] var peerPresences: [PeerId: PeerPresence] = [:] var notificationSettings: [PeerId: PeerNotificationSettings] = [:] - var channelStates: [PeerId: ChannelState] = [:] + var channelStates: [PeerId: Int32] = [:] switch result { case let .peerDialogs(dialogs, messages, chats, users, _): @@ -644,9 +644,10 @@ private func loadAndStorePeerChatInfos(accountPeerId: PeerId, postbox: Postbox, transaction.replaceMessageTagSummary(peerId: peerId, tagMask: .unseenPersonalMessage, namespace: Namespaces.Message.Cloud, count: unreadMentionsCount, maxId: topMessage) if let pts = pts { - let channelState = ChannelState(pts: pts, invalidatedPts: pts, synchronizedUntilMessageId: nil) - transaction.setPeerChatState(peerId, state: channelState) - channelStates[peer.peerId] = channelState + if transaction.getPeerChatState(peerId) == nil { + transaction.setPeerChatState(peerId, state: ChannelState(pts: pts, invalidatedPts: nil, synchronizedUntilMessageId: nil)) + } + channelStates[peer.peerId] = pts } case .dialogFolder: assertionFailure() @@ -659,9 +660,9 @@ private func loadAndStorePeerChatInfos(accountPeerId: PeerId, postbox: Postbox, if let storeMessage = StoreMessage(apiMessage: message) { var updatedStoreMessage = storeMessage if case let .Id(id) = storeMessage.id { - if let channelState = channelStates[id.peerId] { + if let channelPts = channelStates[id.peerId] { var updatedAttributes = storeMessage.attributes - updatedAttributes.append(ChannelMessageStateVersionAttribute(pts: channelState.pts)) + updatedAttributes.append(ChannelMessageStateVersionAttribute(pts: channelPts)) updatedStoreMessage = updatedStoreMessage.withUpdatedAttributes(updatedAttributes) } } diff --git a/submodules/TelegramCore/Sources/FetchChatList.swift b/submodules/TelegramCore/Sources/FetchChatList.swift index 3d7f923cd7..9da9b60c2c 100644 --- a/submodules/TelegramCore/Sources/FetchChatList.swift +++ b/submodules/TelegramCore/Sources/FetchChatList.swift @@ -19,7 +19,7 @@ struct ParsedDialogs { let notificationSettings: [PeerId: PeerNotificationSettings] let readStates: [PeerId: [MessageId.Namespace: PeerReadState]] let mentionTagSummaries: [PeerId: MessageHistoryTagNamespaceSummary] - let chatStates: [PeerId: PeerChatState] + let channelStates: [PeerId: Int32] let topMessageIds: [PeerId: MessageId] let storeMessages: [StoreMessage] @@ -50,7 +50,7 @@ private func parseDialogs(apiDialogs: [Api.Dialog], apiMessages: [Api.Message], var notificationSettings: [PeerId: PeerNotificationSettings] = [:] var readStates: [PeerId: [MessageId.Namespace: PeerReadState]] = [:] var mentionTagSummaries: [PeerId: MessageHistoryTagNamespaceSummary] = [:] - var chatStates: [PeerId: PeerChatState] = [:] + var channelStates: [PeerId: Int32] = [:] var topMessageIds: [PeerId: MessageId] = [:] var storeMessages: [StoreMessage] = [] @@ -131,7 +131,7 @@ private func parseDialogs(apiDialogs: [Api.Dialog], apiMessages: [Api.Message], } if let apiChannelPts = apiChannelPts { - chatStates[peerId] = ChannelState(pts: apiChannelPts, invalidatedPts: nil, synchronizedUntilMessageId: nil) + channelStates[peerId] = apiChannelPts } notificationSettings[peerId] = TelegramPeerNotificationSettings(apiSettings: apiNotificationSettings) @@ -149,9 +149,9 @@ private func parseDialogs(apiDialogs: [Api.Dialog], apiMessages: [Api.Message], if let storeMessage = StoreMessage(apiMessage: message) { var updatedStoreMessage = storeMessage if case let .Id(id) = storeMessage.id { - if let channelState = chatStates[id.peerId] as? ChannelState { + if let channelPts = channelStates[id.peerId] { var updatedAttributes = storeMessage.attributes - updatedAttributes.append(ChannelMessageStateVersionAttribute(pts: channelState.pts)) + updatedAttributes.append(ChannelMessageStateVersionAttribute(pts: channelPts)) updatedStoreMessage = updatedStoreMessage.withUpdatedAttributes(updatedAttributes) } @@ -174,7 +174,7 @@ private func parseDialogs(apiDialogs: [Api.Dialog], apiMessages: [Api.Message], notificationSettings: notificationSettings, readStates: readStates, mentionTagSummaries: mentionTagSummaries, - chatStates: chatStates, + channelStates: channelStates, topMessageIds: topMessageIds, storeMessages: storeMessages, @@ -190,7 +190,7 @@ struct FetchedChatList { let notificationSettings: [PeerId: PeerNotificationSettings] let readStates: [PeerId: [MessageId.Namespace: PeerReadState]] let mentionTagSummaries: [PeerId: MessageHistoryTagNamespaceSummary] - let chatStates: [PeerId: PeerChatState] + let channelStates: [PeerId: Int32] let storeMessages: [StoreMessage] let topMessageIds: [PeerId: MessageId] @@ -295,7 +295,7 @@ func fetchChatList(postbox: Postbox, network: Network, location: FetchChatListLo var notificationSettings: [PeerId: PeerNotificationSettings] = [:] var readStates: [PeerId: [MessageId.Namespace: PeerReadState]] = [:] var mentionTagSummaries: [PeerId: MessageHistoryTagNamespaceSummary] = [:] - var chatStates: [PeerId: PeerChatState] = [:] + var channelStates: [PeerId: Int32] = [:] var storeMessages: [StoreMessage] = [] var topMessageIds: [PeerId: MessageId] = [:] @@ -304,7 +304,7 @@ func fetchChatList(postbox: Postbox, network: Network, location: FetchChatListLo notificationSettings.merge(parsedRemoteChats.notificationSettings, uniquingKeysWith: { _, updated in updated }) readStates.merge(parsedRemoteChats.readStates, uniquingKeysWith: { _, updated in updated }) mentionTagSummaries.merge(parsedRemoteChats.mentionTagSummaries, uniquingKeysWith: { _, updated in updated }) - chatStates.merge(parsedRemoteChats.chatStates, uniquingKeysWith: { _, updated in updated }) + channelStates.merge(parsedRemoteChats.channelStates, uniquingKeysWith: { _, updated in updated }) storeMessages.append(contentsOf: parsedRemoteChats.storeMessages) topMessageIds.merge(parsedRemoteChats.topMessageIds, uniquingKeysWith: { _, updated in updated }) @@ -314,7 +314,7 @@ func fetchChatList(postbox: Postbox, network: Network, location: FetchChatListLo notificationSettings.merge(parsedPinnedChats.notificationSettings, uniquingKeysWith: { _, updated in updated }) readStates.merge(parsedPinnedChats.readStates, uniquingKeysWith: { _, updated in updated }) mentionTagSummaries.merge(parsedPinnedChats.mentionTagSummaries, uniquingKeysWith: { _, updated in updated }) - chatStates.merge(parsedPinnedChats.chatStates, uniquingKeysWith: { _, updated in updated }) + channelStates.merge(parsedPinnedChats.channelStates, uniquingKeysWith: { _, updated in updated }) storeMessages.append(contentsOf: parsedPinnedChats.storeMessages) topMessageIds.merge(parsedPinnedChats.topMessageIds, uniquingKeysWith: { _, updated in updated }) } @@ -336,7 +336,7 @@ func fetchChatList(postbox: Postbox, network: Network, location: FetchChatListLo notificationSettings.merge(folderChats.notificationSettings, uniquingKeysWith: { _, updated in updated }) readStates.merge(folderChats.readStates, uniquingKeysWith: { _, updated in updated }) mentionTagSummaries.merge(folderChats.mentionTagSummaries, uniquingKeysWith: { _, updated in updated }) - chatStates.merge(folderChats.chatStates, uniquingKeysWith: { _, updated in updated }) + channelStates.merge(folderChats.channelStates, uniquingKeysWith: { _, updated in updated }) storeMessages.append(contentsOf: folderChats.storeMessages) } @@ -369,7 +369,7 @@ func fetchChatList(postbox: Postbox, network: Network, location: FetchChatListLo notificationSettings: notificationSettings, readStates: readStates, mentionTagSummaries: mentionTagSummaries, - chatStates: chatStates, + channelStates: channelStates, storeMessages: storeMessages, topMessageIds: topMessageIds, diff --git a/submodules/TelegramCore/Sources/Holes.swift b/submodules/TelegramCore/Sources/Holes.swift index bb699b1d0b..8a358707a7 100644 --- a/submodules/TelegramCore/Sources/Holes.swift +++ b/submodules/TelegramCore/Sources/Holes.swift @@ -479,15 +479,11 @@ func fetchChatListHole(postbox: Postbox, network: Network, accountPeerId: PeerId } } - for (peerId, chatState) in fetchedChats.chatStates { - if let chatState = chatState as? ChannelState { - if let current = transaction.getPeerChatState(peerId) as? ChannelState { - transaction.setPeerChatState(peerId, state: current.withUpdatedPts(chatState.pts)) - } else { - transaction.setPeerChatState(peerId, state: chatState) - } + for (peerId, pts) in fetchedChats.channelStates { + if let current = transaction.getPeerChatState(peerId) as? ChannelState { + transaction.setPeerChatState(peerId, state: current.withUpdatedPts(pts)) } else { - transaction.setPeerChatState(peerId, state: chatState) + transaction.setPeerChatState(peerId, state: ChannelState(pts: pts, invalidatedPts: nil, synchronizedUntilMessageId: nil)) } } diff --git a/submodules/TelegramCore/Sources/ManagedSynchronizePeerReadStates.swift b/submodules/TelegramCore/Sources/ManagedSynchronizePeerReadStates.swift index ba0b8de09e..babafd68c6 100644 --- a/submodules/TelegramCore/Sources/ManagedSynchronizePeerReadStates.swift +++ b/submodules/TelegramCore/Sources/ManagedSynchronizePeerReadStates.swift @@ -2,70 +2,134 @@ import Foundation import Postbox import SwiftSignalKit -private final class ManagedSynchronizePeerReadStatesState { - private var synchronizeDisposables: [PeerId: (PeerReadStateSynchronizationOperation, Disposable)] = [:] - - func clearDisposables() -> [Disposable] { - let disposables = Array(self.synchronizeDisposables.values.map({ $0.1 })) - self.synchronizeDisposables.removeAll() - return disposables +private final class SynchronizePeerReadStatesContextImpl { + private final class Operation { + let operation: PeerReadStateSynchronizationOperation + let disposable: Disposable + + init( + operation: PeerReadStateSynchronizationOperation, + disposable: Disposable + ) { + self.operation = operation + self.disposable = disposable + } + + deinit { + self.disposable.dispose() + } } - func update(operations: [PeerId: PeerReadStateSynchronizationOperation]) -> (removed: [Disposable], added: [(PeerId, PeerReadStateSynchronizationOperation, MetaDisposable)]) { - var removed: [Disposable] = [] - var added: [(PeerId, PeerReadStateSynchronizationOperation, MetaDisposable)] = [] + private let queue: Queue + private let network: Network + private let postbox: Postbox + private let stateManager: AccountStateManager + + private var disposable: Disposable? + + private var currentState: [PeerId : PeerReadStateSynchronizationOperation] = [:] + private var activeOperations: [PeerId: Operation] = [:] + private var pendingOperations: [PeerId: PeerReadStateSynchronizationOperation] = [:] + + init(queue: Queue, network: Network, postbox: Postbox, stateManager: AccountStateManager) { + self.queue = queue + self.network = network + self.postbox = postbox + self.stateManager = stateManager - for (peerId, (operation, disposable)) in self.synchronizeDisposables { - if operations[peerId] != operation { - removed.append(disposable) - self.synchronizeDisposables.removeValue(forKey: peerId) + self.disposable = (postbox.synchronizePeerReadStatesView() + |> deliverOn(self.queue)).start(next: { [weak self] view in + guard let strongSelf = self else { + return + } + strongSelf.currentState = view.operations + strongSelf.update() + }) + } + + deinit { + self.disposable?.dispose() + } + + func dispose() { + } + + private func update() { + let peerIds = Set(self.currentState.keys).union(Set(self.pendingOperations.keys)) + + for peerId in peerIds { + var maybeOperation: PeerReadStateSynchronizationOperation? + if let operation = self.currentState[peerId] { + maybeOperation = operation + } else if let operation = self.pendingOperations[peerId] { + maybeOperation = operation + self.pendingOperations.removeValue(forKey: peerId) + } + + if let operation = maybeOperation { + if let current = self.activeOperations[peerId] { + if current.operation != operation { + self.pendingOperations[peerId] = operation + } + } else { + let operationDisposable = MetaDisposable() + let activeOperation = Operation( + operation: operation, + disposable: operationDisposable + ) + self.activeOperations[peerId] = activeOperation + let signal: Signal + switch operation { + case .Validate: + signal = synchronizePeerReadState(network: self.network, postbox: self.postbox, stateManager: self.stateManager, peerId: peerId, push: false, validate: true) + |> ignoreValues + case let .Push(_, thenSync): + signal = synchronizePeerReadState(network: self.network, postbox: self.postbox, stateManager: stateManager, peerId: peerId, push: true, validate: thenSync) + |> ignoreValues + } + operationDisposable.set((signal + |> deliverOn(self.queue)).start(completed: { [weak self, weak activeOperation] in + guard let strongSelf = self else { + return + } + if let activeOperation = activeOperation { + if let current = strongSelf.activeOperations[peerId], current === activeOperation { + strongSelf.activeOperations.removeValue(forKey: peerId) + strongSelf.update() + } + } + })) + } } } - - for (peerId, operation) in operations { - if self.synchronizeDisposables[peerId] == nil { - let disposable = MetaDisposable() - self.synchronizeDisposables[peerId] = (operation, disposable) - added.append((peerId, operation, disposable)) - } + } +} + +private final class SynchronizePeerReadStatesStatesContext { + private let queue: Queue + private let impl: QueueLocalObject + + init(network: Network, postbox: Postbox, stateManager: AccountStateManager) { + self.queue = Queue() + let queue = self.queue + self.impl = QueueLocalObject(queue: queue, generate: { + return SynchronizePeerReadStatesContextImpl(queue: queue, network: network, postbox: postbox, stateManager: stateManager) + }) + } + + func dispose() { + self.impl.with { impl in + impl.dispose() } - - return (removed, added) } } func managedSynchronizePeerReadStates(network: Network, postbox: Postbox, stateManager: AccountStateManager) -> Signal { return Signal { _ in - let state = Atomic(value: ManagedSynchronizePeerReadStatesState()) - - let disposable = postbox.synchronizePeerReadStatesView().start(next: { view in - let (removed, added) = state.with { state -> (removed: [Disposable], added: [(PeerId, PeerReadStateSynchronizationOperation, MetaDisposable)]) in - return state.update(operations: view.operations) - } - - for disposable in removed { - disposable.dispose() - } - - for (peerId, operation, disposable) in added { - let synchronizeOperation: Signal - switch operation { - case .Validate: - synchronizeOperation = synchronizePeerReadState(network: network, postbox: postbox, stateManager: stateManager, peerId: peerId, push: false, validate: true) - case let .Push(_, thenSync): - synchronizeOperation = synchronizePeerReadState(network: network, postbox: postbox, stateManager: stateManager, peerId: peerId, push: true, validate: thenSync) - } - disposable.set(synchronizeOperation.start()) - } - }) + let context = SynchronizePeerReadStatesStatesContext(network: network, postbox: postbox, stateManager: stateManager) return ActionDisposable { - disposable.dispose() - for disposable in state.with({ state -> [Disposable] in - state.clearDisposables() - }) { - disposable.dispose() - } + context.dispose() } } } diff --git a/submodules/TelegramCore/Sources/ManagedSynchronizePinnedChatsOperations.swift b/submodules/TelegramCore/Sources/ManagedSynchronizePinnedChatsOperations.swift index d726df5b03..b5ff3b474e 100644 --- a/submodules/TelegramCore/Sources/ManagedSynchronizePinnedChatsOperations.swift +++ b/submodules/TelegramCore/Sources/ManagedSynchronizePinnedChatsOperations.swift @@ -135,7 +135,7 @@ private func synchronizePinnedChats(transaction: Transaction, postbox: Postbox, |> mapToSignal { dialogs -> Signal in var storeMessages: [StoreMessage] = [] var readStates: [PeerId: [MessageId.Namespace: PeerReadState]] = [:] - var chatStates: [PeerId: PeerChatState] = [:] + var channelStates: [PeerId: Int32] = [:] var notificationSettings: [PeerId: PeerNotificationSettings] = [:] var remoteItemIds: [PinnedItemId] = [] @@ -200,7 +200,7 @@ private func synchronizePinnedChats(transaction: Transaction, postbox: Postbox, readStates[peerId]![Namespaces.Message.Cloud] = .idBased(maxIncomingReadId: apiReadInboxMaxId, maxOutgoingReadId: apiReadOutboxMaxId, maxKnownId: apiTopMessage, count: apiUnreadCount, markedUnread: apiMarkedUnread) if let apiChannelPts = apiChannelPts { - chatStates[peerId] = ChannelState(pts: apiChannelPts, invalidatedPts: nil, synchronizedUntilMessageId: nil) + channelStates[peerId] = apiChannelPts } notificationSettings[peerId] = TelegramPeerNotificationSettings(apiSettings: apiNotificationSettings) @@ -245,15 +245,11 @@ private func synchronizePinnedChats(transaction: Transaction, postbox: Postbox, transaction.resetIncomingReadStates(readStates) - for (peerId, chatState) in chatStates { - if let chatState = chatState as? ChannelState { - if let _ = transaction.getPeerChatState(peerId) as? ChannelState { - // skip changing state - } else { - transaction.setPeerChatState(peerId, state: chatState) - } + for (peerId, pts) in channelStates { + if let _ = transaction.getPeerChatState(peerId) as? ChannelState { + // skip changing state } else { - transaction.setPeerChatState(peerId, state: chatState) + transaction.setPeerChatState(peerId, state: ChannelState(pts: pts, invalidatedPts: nil, synchronizedUntilMessageId: nil)) } } diff --git a/submodules/TelegramUI/Sources/ChatInterfaceStateContextMenus.swift b/submodules/TelegramUI/Sources/ChatInterfaceStateContextMenus.swift index 38630e8e75..9b3ad9d2ff 100644 --- a/submodules/TelegramUI/Sources/ChatInterfaceStateContextMenus.swift +++ b/submodules/TelegramUI/Sources/ChatInterfaceStateContextMenus.swift @@ -49,8 +49,20 @@ private func canEditMessage(accountPeerId: PeerId, limitsConfiguration: LimitsCo } } else if message.id.peerId.namespace == Namespaces.Peer.SecretChat || message.id.namespace != Namespaces.Message.Cloud { hasEditRights = false - } else if let author = message.author, author.id == accountPeerId { + } else if let author = message.author, author.id == accountPeerId, let peer = message.peers[message.id.peerId] { hasEditRights = true + if let peer = peer as? TelegramChannel { + switch peer.info { + case .broadcast: + if peer.hasPermission(.editAllMessages) || !message.flags.contains(.Incoming) { + unlimitedInterval = true + } + case .group: + if peer.hasPermission(.pinMessages) { + unlimitedInterval = true + } + } + } } else if message.author?.id == message.id.peerId, let peer = message.peers[message.id.peerId] { if let peer = peer as? TelegramChannel { switch peer.info {