From cf40afc5a965059d81fb3ef489868fe73f4866a1 Mon Sep 17 00:00:00 2001 From: Ali <> Date: Fri, 2 Oct 2020 20:11:09 +0100 Subject: [PATCH 01/14] Don't create temp keys when not nocessary --- submodules/MtProtoKit/Sources/MTBackupAddressSignals.m | 2 +- .../MtProtoKit/Sources/MTDiscoverDatacenterAddressAction.m | 4 +++- submodules/MtProtoKit/Sources/MTProxyConnectivity.m | 2 +- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/submodules/MtProtoKit/Sources/MTBackupAddressSignals.m b/submodules/MtProtoKit/Sources/MTBackupAddressSignals.m index 8eead4103e..6375bcc286 100644 --- a/submodules/MtProtoKit/Sources/MTBackupAddressSignals.m +++ b/submodules/MtProtoKit/Sources/MTBackupAddressSignals.m @@ -240,7 +240,7 @@ static NSString *makeRandomPadding() { apiEnvironment.disableUpdates = true; apiEnvironment.langPack = currentContext.apiEnvironment.langPack; - MTContext *context = [[MTContext alloc] initWithSerialization:currentContext.serialization encryptionProvider:currentContext.encryptionProvider apiEnvironment:apiEnvironment isTestingEnvironment:currentContext.isTestingEnvironment useTempAuthKeys:address.datacenterId != 0 ? currentContext.useTempAuthKeys : false]; + MTContext *context = [[MTContext alloc] initWithSerialization:currentContext.serialization encryptionProvider:currentContext.encryptionProvider apiEnvironment:apiEnvironment isTestingEnvironment:currentContext.isTestingEnvironment useTempAuthKeys:false]; if (address.datacenterId != 0) { //context.keychain = currentContext.keychain; diff --git a/submodules/MtProtoKit/Sources/MTDiscoverDatacenterAddressAction.m b/submodules/MtProtoKit/Sources/MTDiscoverDatacenterAddressAction.m index bfd5b5292d..980cb49651 100644 --- a/submodules/MtProtoKit/Sources/MTDiscoverDatacenterAddressAction.m +++ b/submodules/MtProtoKit/Sources/MTDiscoverDatacenterAddressAction.m @@ -117,8 +117,10 @@ [_requestService addRequest:request]; } - else + else { + [context authInfoForDatacenterWithIdRequired:_targetDatacenterId isCdn:false selector:MTDatacenterAuthInfoSelectorPersistent]; + } } } diff --git a/submodules/MtProtoKit/Sources/MTProxyConnectivity.m b/submodules/MtProtoKit/Sources/MTProxyConnectivity.m index 0ac9eb2676..a12f89d080 100644 --- a/submodules/MtProtoKit/Sources/MTProxyConnectivity.m +++ b/submodules/MtProtoKit/Sources/MTProxyConnectivity.m @@ -64,7 +64,7 @@ MTPayloadData payloadData; NSData *data = [MTDiscoverConnectionSignals payloadData:&payloadData context:context address:address]; - MTContext *proxyContext = [[MTContext alloc] initWithSerialization:context.serialization encryptionProvider:context.encryptionProvider apiEnvironment:[[context apiEnvironment] withUpdatedSocksProxySettings:settings] isTestingEnvironment:context.isTestingEnvironment useTempAuthKeys:context.useTempAuthKeys]; + MTContext *proxyContext = [[MTContext alloc] initWithSerialization:context.serialization encryptionProvider:context.encryptionProvider apiEnvironment:[[context apiEnvironment] withUpdatedSocksProxySettings:settings] isTestingEnvironment:context.isTestingEnvironment useTempAuthKeys:false]; MTTcpConnection *connection = [[MTTcpConnection alloc] initWithContext:proxyContext datacenterId:datacenterId scheme:[[MTTransportScheme alloc] initWithTransportClass:[MTTcpConnection class] address:address media:false] interface:nil usageCalculationInfo:nil]; __weak MTTcpConnection *weakConnection = connection; From a0c42a3e63f255261f46d424b9408ae4bb204b2b Mon Sep 17 00:00:00 2001 From: Ali <> Date: Fri, 2 Oct 2020 22:23:33 +0100 Subject: [PATCH 02/14] [Temp] Control temp keys with app_config --- .../SyncCore/Sources/NetworkSettings.swift | 16 ++++++++++++++-- .../Sources/ManagedAppConfigurationUpdates.swift | 9 +++++++++ submodules/TelegramCore/Sources/Network.swift | 13 ++++++++++++- .../TelegramCore/Sources/NetworkSettings.swift | 4 ++-- 4 files changed, 37 insertions(+), 5 deletions(-) diff --git a/submodules/SyncCore/Sources/NetworkSettings.swift b/submodules/SyncCore/Sources/NetworkSettings.swift index b8341c79fb..ba104abbc9 100644 --- a/submodules/SyncCore/Sources/NetworkSettings.swift +++ b/submodules/SyncCore/Sources/NetworkSettings.swift @@ -4,21 +4,27 @@ public struct NetworkSettings: PreferencesEntry, Equatable { public var reducedBackupDiscoveryTimeout: Bool public var applicationUpdateUrlPrefix: String? public var backupHostOverride: String? + public var defaultEnableTempKeys: Bool + public var userEnableTempKeys: Bool? public static var defaultSettings: NetworkSettings { - return NetworkSettings(reducedBackupDiscoveryTimeout: false, applicationUpdateUrlPrefix: nil, backupHostOverride: nil) + return NetworkSettings(reducedBackupDiscoveryTimeout: false, applicationUpdateUrlPrefix: nil, backupHostOverride: nil, defaultEnableTempKeys: true, userEnableTempKeys: nil) } - public init(reducedBackupDiscoveryTimeout: Bool, applicationUpdateUrlPrefix: String?, backupHostOverride: String?) { + public init(reducedBackupDiscoveryTimeout: Bool, applicationUpdateUrlPrefix: String?, backupHostOverride: String?, defaultEnableTempKeys: Bool, userEnableTempKeys: Bool?) { self.reducedBackupDiscoveryTimeout = reducedBackupDiscoveryTimeout self.applicationUpdateUrlPrefix = applicationUpdateUrlPrefix self.backupHostOverride = backupHostOverride + self.defaultEnableTempKeys = defaultEnableTempKeys + self.userEnableTempKeys = userEnableTempKeys } public init(decoder: PostboxDecoder) { self.reducedBackupDiscoveryTimeout = decoder.decodeInt32ForKey("reducedBackupDiscoveryTimeout", orElse: 0) != 0 self.applicationUpdateUrlPrefix = decoder.decodeOptionalStringForKey("applicationUpdateUrlPrefix") self.backupHostOverride = decoder.decodeOptionalStringForKey("backupHostOverride") + self.defaultEnableTempKeys = decoder.decodeBoolForKey("defaultEnableTempKeys", orElse: true) + self.userEnableTempKeys = decoder.decodeOptionalBoolForKey("userEnableTempKeys") } public func encode(_ encoder: PostboxEncoder) { @@ -33,6 +39,12 @@ public struct NetworkSettings: PreferencesEntry, Equatable { } else { encoder.encodeNil(forKey: "backupHostOverride") } + encoder.encodeBool(self.defaultEnableTempKeys, forKey: "defaultEnableTempKeys") + if let userEnableTempKeys = self.userEnableTempKeys { + encoder.encodeBool(userEnableTempKeys, forKey: "userEnableTempKeys") + } else { + encoder.encodeNil(forKey: "userEnableTempKeys") + } } public func isEqual(to: PreferencesEntry) -> Bool { diff --git a/submodules/TelegramCore/Sources/ManagedAppConfigurationUpdates.swift b/submodules/TelegramCore/Sources/ManagedAppConfigurationUpdates.swift index b7a757eee1..607c7d5102 100644 --- a/submodules/TelegramCore/Sources/ManagedAppConfigurationUpdates.swift +++ b/submodules/TelegramCore/Sources/ManagedAppConfigurationUpdates.swift @@ -23,6 +23,15 @@ func updateAppConfigurationOnce(postbox: Postbox, network: Network) -> Signal NetworkSettings) { +public func updateNetworkSettingsInteractively(transaction: Transaction, network: Network?, _ f: @escaping (NetworkSettings) -> NetworkSettings) { var updateNetwork = false var updatedSettings: NetworkSettings? transaction.updatePreferencesEntry(key: PreferencesKeys.networkSettings, { current in @@ -33,7 +33,7 @@ public func updateNetworkSettingsInteractively(transaction: Transaction, network return updated }) - if updateNetwork, let updatedSettings = updatedSettings { + if let network = network, updateNetwork, let updatedSettings = updatedSettings { network.context.updateApiEnvironment { current in return current?.withUpdatedNetworkSettings(updatedSettings.mtNetworkSettings) } From d19489b0836344ea60cfcf078f7e85d339bcd394 Mon Sep 17 00:00:00 2001 From: Ali <> Date: Fri, 2 Oct 2020 22:26:25 +0100 Subject: [PATCH 03/14] Bump version --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 625c56dc0f..db4f5cdcf8 100644 --- a/Makefile +++ b/Makefile @@ -3,7 +3,7 @@ include Utils.makefile -APP_VERSION="7.1" +APP_VERSION="7.1.1" CORE_COUNT=$(shell sysctl -n hw.logicalcpu) CORE_COUNT_MINUS_ONE=$(shell expr ${CORE_COUNT} \- 1) From b58d71c1c31657da9b78d92387de003e31fb34d1 Mon Sep 17 00:00:00 2001 From: Ali <> Date: Sat, 3 Oct 2020 11:19:42 +0100 Subject: [PATCH 04/14] Cleanup and add logging --- .../Sources/MTDatacenterAuthMessageService.m | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/submodules/MtProtoKit/Sources/MTDatacenterAuthMessageService.m b/submodules/MtProtoKit/Sources/MTDatacenterAuthMessageService.m index e9d94c678b..194dfdad9e 100644 --- a/submodules/MtProtoKit/Sources/MTDatacenterAuthMessageService.m +++ b/submodules/MtProtoKit/Sources/MTDatacenterAuthMessageService.m @@ -109,9 +109,9 @@ static NSDictionary *selectPublicKey(NSArray *fingerprints, NSArray _encryptionProvider; bool _tempAuth; - MTSessionInfo *_sessionInfo; MTDatacenterAuthStage _stage; int64_t _currentStageMessageId; @@ -165,7 +164,6 @@ typedef enum { { _encryptionProvider = context.encryptionProvider; _tempAuth = tempAuth; - _sessionInfo = [[MTSessionInfo alloc] initWithRandomSessionIdAndContext:context]; } return self; } @@ -267,7 +265,7 @@ typedef enum { [reqDhBuffer appendInt64:_dhPublicKeyFingerprint]; [reqDhBuffer appendTLBytes:_dhEncryptedData]; - NSString *messageDescription = [NSString stringWithFormat:@"reqDh nonce:%@ serverNonce:%@ p:%@ q:%@ fingerprint:%llx", _nonce, _serverNonce, _dhP, _dhQ, _dhPublicKeyFingerprint]; + NSString *messageDescription = [NSString stringWithFormat:@"reqDh nonce:%@ serverNonce:%@ p:%@ q:%@ fingerprint:%llx dhEncryptedData:%d bytes", _nonce, _serverNonce, _dhP, _dhQ, _dhPublicKeyFingerprint, (int)_dhEncryptedData.length]; MTOutgoingMessage *message = [[MTOutgoingMessage alloc] initWithData:reqDhBuffer.data metadata:messageDescription additionalDebugDescription:nil shortMetadata:messageDescription messageId:_currentStageMessageId messageSeqNo:_currentStageMessageSeqNo]; return [[MTMessageTransaction alloc] initWithMessagePayload:@[message] prepared:nil failed:nil completion:^(NSDictionary *messageInternalIdToTransactionId, NSDictionary *messageInternalIdToPreparedMessage, __unused NSDictionary *messageInternalIdToQuickAckId) { @@ -402,7 +400,11 @@ typedef enum { arc4random_buf(&random, 1); [dataWithHash appendBytes:&random length:1]; } + NSData *encryptedData = MTRsaEncrypt(_encryptionProvider, [publicKey objectForKey:@"key"], dataWithHash); + if (MTLogEnabled()) { + MTLog(@"[MTDatacenterAuthMessageService#%p encryptedData length %d dataWithHash length %d]", self, (int)encryptedData.length, (int)dataWithHash.length); + } if (encryptedData.length < 256) { NSMutableData *newEncryptedData = [[NSMutableData alloc] init]; @@ -438,8 +440,11 @@ typedef enum { arc4random_buf(&random, 1); [dataWithHash appendBytes:&random length:1]; } - + NSData *encryptedData = MTRsaEncrypt(_encryptionProvider, [publicKey objectForKey:@"key"], dataWithHash); + if (MTLogEnabled()) { + MTLog(@"[MTDatacenterAuthMessageService#%p encryptedData length %d dataWithHash length %d]", self, (int)encryptedData.length, (int)dataWithHash.length); + } if (encryptedData.length < 256) { NSMutableData *newEncryptedData = [[NSMutableData alloc] init]; From 061591cf8c2d1a38ebfe52313f1ed6914d1fadb9 Mon Sep 17 00:00:00 2001 From: Ali <> Date: Sat, 3 Oct 2020 11:21:48 +0100 Subject: [PATCH 05/14] Use OpenSSL for RSA --- submodules/MtProtoKit/Sources/MTEncryption.m | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/submodules/MtProtoKit/Sources/MTEncryption.m b/submodules/MtProtoKit/Sources/MTEncryption.m index 4df030344c..348e3065a3 100644 --- a/submodules/MtProtoKit/Sources/MTEncryption.m +++ b/submodules/MtProtoKit/Sources/MTEncryption.m @@ -292,12 +292,13 @@ NSData *MTAesDecrypt(NSData *data, NSData *key, NSData *iv) NSData *MTRsaEncrypt(id provider, NSString *publicKey, NSData *data) { #if TARGET_OS_IOS - NSMutableData *updatedData = [[NSMutableData alloc] initWithData:data]; + return [provider rsaEncryptWithPublicKey:publicKey data:data]; + /*NSMutableData *updatedData = [[NSMutableData alloc] initWithData:data]; while (updatedData.length < 256) { uint8_t zero = 0; [updatedData replaceBytesInRange:NSMakeRange(0, 0) withBytes:&zero length:1]; } - return [MTRsa encryptData:updatedData publicKey:publicKey]; + return [MTRsa encryptData:updatedData publicKey:publicKey];*/ #else return [provider macosRSAEncrypt:publicKey data:data]; #endif From 3be79d78f08714cae37da2741475e8c9f86ce616 Mon Sep 17 00:00:00 2001 From: Ali <> Date: Sat, 3 Oct 2020 11:22:05 +0100 Subject: [PATCH 06/14] Cleanup [nocache] --- submodules/MtProtoKit/Sources/MTProto.m | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/submodules/MtProtoKit/Sources/MTProto.m b/submodules/MtProtoKit/Sources/MTProto.m index 62e23fff8b..c0c1d8177b 100644 --- a/submodules/MtProtoKit/Sources/MTProto.m +++ b/submodules/MtProtoKit/Sources/MTProto.m @@ -1726,8 +1726,13 @@ static const NSUInteger MTMaxUnacknowledgedMessageCount = 64; { [[MTProto managerQueue] dispatchOnQueue:^ { - if (transport != _transport || completion == nil) + if (transport != _transport || completion == nil) { return; + } + + if (_useUnauthorizedMode) { + return; + } MTDatacenterAuthKey *authKey = [self getAuthKeyForCurrentScheme:scheme createIfNeeded:false authInfoSelector:nil]; if (authKey == nil) { @@ -2038,11 +2043,18 @@ static NSString *dumpHexString(NSData *data, int maxLength) { - (void)handleMissingKey:(MTTransportScheme *)scheme { NSAssert([[MTProto managerQueue] isCurrentQueue], @"invalid queue"); + if (_useUnauthorizedMode) { + if (MTLogEnabled()) { + MTLog(@"[MTProto#%p@%p don't handleMissingKey when useUnauthorizedMode]", self, _context); + } + return; + } + MTDatacenterAuthInfoSelector authInfoSelector; [self getAuthKeyForCurrentScheme:scheme createIfNeeded:false authInfoSelector:&authInfoSelector]; if (MTLogEnabled()) { - MTLog(@"[MTProto#%p@%p missing key %lld selector]", self, _context, _validAuthInfo.authInfo.authKeyId, authInfoSelector); + MTLog(@"[MTProto#%p@%p missing key %lld selector %d]", self, _context, _validAuthInfo.authInfo.authKeyId, authInfoSelector); } if (_useExplicitAuthKey != nil) { @@ -2618,7 +2630,7 @@ static NSString *dumpHexString(NSData *data, int maxLength) { { [_context setGlobalTimeDifference:timeDifference]; - if (saltList != nil) + if (!_useUnauthorizedMode && saltList != nil) { if (_useExplicitAuthKey) { if (_validAuthInfo != nil && _validAuthInfo.selector == authInfoSelector) { From bf72e315e409657c8f93d6cfb2c30bed289e82e0 Mon Sep 17 00:00:00 2001 From: Ali <> Date: Sat, 3 Oct 2020 23:33:48 +0100 Subject: [PATCH 07/14] Move settings to config [skip ci] --- .../Sources/ManagedAppConfigurationUpdates.swift | 9 --------- .../Sources/ManagedConfigurationUpdates.swift | 4 ++++ 2 files changed, 4 insertions(+), 9 deletions(-) diff --git a/submodules/TelegramCore/Sources/ManagedAppConfigurationUpdates.swift b/submodules/TelegramCore/Sources/ManagedAppConfigurationUpdates.swift index 607c7d5102..b7a757eee1 100644 --- a/submodules/TelegramCore/Sources/ManagedAppConfigurationUpdates.swift +++ b/submodules/TelegramCore/Sources/ManagedAppConfigurationUpdates.swift @@ -23,15 +23,6 @@ func updateAppConfigurationOnce(postbox: Postbox, network: Network) -> Signal Date: Sat, 3 Oct 2020 23:46:18 +0100 Subject: [PATCH 08/14] Change defaults [nocache] --- submodules/SyncCore/Sources/NetworkSettings.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/submodules/SyncCore/Sources/NetworkSettings.swift b/submodules/SyncCore/Sources/NetworkSettings.swift index ba104abbc9..94d17222eb 100644 --- a/submodules/SyncCore/Sources/NetworkSettings.swift +++ b/submodules/SyncCore/Sources/NetworkSettings.swift @@ -8,7 +8,7 @@ public struct NetworkSettings: PreferencesEntry, Equatable { public var userEnableTempKeys: Bool? public static var defaultSettings: NetworkSettings { - return NetworkSettings(reducedBackupDiscoveryTimeout: false, applicationUpdateUrlPrefix: nil, backupHostOverride: nil, defaultEnableTempKeys: true, userEnableTempKeys: nil) + return NetworkSettings(reducedBackupDiscoveryTimeout: false, applicationUpdateUrlPrefix: nil, backupHostOverride: nil, defaultEnableTempKeys: false, userEnableTempKeys: nil) } public init(reducedBackupDiscoveryTimeout: Bool, applicationUpdateUrlPrefix: String?, backupHostOverride: String?, defaultEnableTempKeys: Bool, userEnableTempKeys: Bool?) { @@ -23,7 +23,7 @@ public struct NetworkSettings: PreferencesEntry, Equatable { self.reducedBackupDiscoveryTimeout = decoder.decodeInt32ForKey("reducedBackupDiscoveryTimeout", orElse: 0) != 0 self.applicationUpdateUrlPrefix = decoder.decodeOptionalStringForKey("applicationUpdateUrlPrefix") self.backupHostOverride = decoder.decodeOptionalStringForKey("backupHostOverride") - self.defaultEnableTempKeys = decoder.decodeBoolForKey("defaultEnableTempKeys", orElse: true) + self.defaultEnableTempKeys = decoder.decodeBoolForKey("defaultEnableTempKeys", orElse: false) self.userEnableTempKeys = decoder.decodeOptionalBoolForKey("userEnableTempKeys") } From 4de8005453f5bf96c47ed5daf9cd9d123028c49f Mon Sep 17 00:00:00 2001 From: Ali <> Date: Sun, 4 Oct 2020 00:06:29 +0100 Subject: [PATCH 09/14] Don't fail on cancel [nocache] --- submodules/MtProtoKit/Sources/MTDatacenterAuthAction.m | 1 - 1 file changed, 1 deletion(-) diff --git a/submodules/MtProtoKit/Sources/MTDatacenterAuthAction.m b/submodules/MtProtoKit/Sources/MTDatacenterAuthAction.m index 736b69f546..1a36bbeecc 100644 --- a/submodules/MtProtoKit/Sources/MTDatacenterAuthAction.m +++ b/submodules/MtProtoKit/Sources/MTDatacenterAuthAction.m @@ -180,7 +180,6 @@ - (void)cancel { [self cleanup]; - [self fail]; } - (void)complete { From 6f82d09f40f31b47e831a068664871eebbf21718 Mon Sep 17 00:00:00 2001 From: Ali <> Date: Mon, 5 Oct 2020 17:20:19 +0100 Subject: [PATCH 10/14] Transform updateShortChatMessage author to peerUser, not peerChat --- submodules/TelegramCore/Sources/UpdateMessageService.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/submodules/TelegramCore/Sources/UpdateMessageService.swift b/submodules/TelegramCore/Sources/UpdateMessageService.swift index bca8a5a76e..32e797fb71 100644 --- a/submodules/TelegramCore/Sources/UpdateMessageService.swift +++ b/submodules/TelegramCore/Sources/UpdateMessageService.swift @@ -58,7 +58,7 @@ class UpdateMessageService: NSObject, MTMessageService { self.putNext(groups) } case let .updateShortChatMessage(flags, id, fromId, chatId, message, pts, ptsCount, date, fwdFrom, viaBotId, replyHeader, entities): - let generatedMessage = Api.Message.message(flags: flags, id: id, fromId: .peerChat(chatId: fromId), peerId: Api.Peer.peerChat(chatId: chatId), fwdFrom: fwdFrom, viaBotId: viaBotId, replyTo: replyHeader, date: date, message: message, media: Api.MessageMedia.messageMediaEmpty, replyMarkup: nil, entities: entities, views: nil, forwards: nil, replies: nil, editDate: nil, postAuthor: nil, groupedId: nil, restrictionReason: nil) + let generatedMessage = Api.Message.message(flags: flags, id: id, fromId: .peerUser(userId: fromId), peerId: Api.Peer.peerChat(chatId: chatId), fwdFrom: fwdFrom, viaBotId: viaBotId, replyTo: replyHeader, date: date, message: message, media: Api.MessageMedia.messageMediaEmpty, replyMarkup: nil, entities: entities, views: nil, forwards: nil, replies: nil, editDate: nil, postAuthor: nil, groupedId: nil, restrictionReason: nil) let update = Api.Update.updateNewMessage(message: generatedMessage, pts: pts, ptsCount: ptsCount) let groups = groupUpdates([update], users: [], chats: [], date: date, seqRange: nil) if groups.count != 0 { From de039d7303475e123845a26d1a410cee6a48b881 Mon Sep 17 00:00:00 2001 From: Ali <> Date: Tue, 6 Oct 2020 15:04:01 +0100 Subject: [PATCH 11/14] [WIP] Pinned messages --- Telegram/NotificationService/Serialization.m | 2 +- .../Telegram-iOS/en.lproj/Localizable.strings | 1 + .../Sources/LegacySuggestionContext.swift | 2 +- .../Sources/SearchPeerMembers.swift | 47 +- submodules/TelegramApi/Sources/Api0.swift | 1 + submodules/TelegramApi/Sources/Api1.swift | 20 + submodules/TelegramApi/Sources/Api3.swift | 38 +- .../TelegramCore/Sources/SearchMessages.swift | 10 +- .../TelegramCore/Sources/Serialization.swift | 2 +- .../Sources/PresentationStrings.swift | 2403 +++++++++-------- .../Resources/PresentationStrings.mapping | Bin 156951 -> 156997 bytes .../TelegramUI/Sources/ChatController.swift | 89 +- .../Sources/ChatControllerNode.swift | 2 +- .../Sources/ChatHistoryListNode.swift | 10 + .../ChatInterfaceStateContextMenus.swift | 2 +- .../ChatInterfaceStateContextQueries.swift | 4 +- .../ChatInterfaceTitlePanelNodes.swift | 2 +- .../ChatPinnedMessageTitlePanelNode.swift | 78 +- .../ChatPresentationInterfaceState.swift | 41 +- .../WalletUI/Resources/WalletStrings.mapping | Bin 8422 -> 8422 bytes .../WalletUI/Sources/WalletStrings.swift | 4 +- 21 files changed, 1477 insertions(+), 1281 deletions(-) diff --git a/Telegram/NotificationService/Serialization.m b/Telegram/NotificationService/Serialization.m index f137bbe5df..cce25b19cc 100644 --- a/Telegram/NotificationService/Serialization.m +++ b/Telegram/NotificationService/Serialization.m @@ -3,7 +3,7 @@ @implementation Serialization - (NSUInteger)currentLayer { - return 119; + return 120; } - (id _Nullable)parseMessage:(NSData * _Nullable)data { diff --git a/Telegram/Telegram-iOS/en.lproj/Localizable.strings b/Telegram/Telegram-iOS/en.lproj/Localizable.strings index 337a3fdeb7..2beee1714b 100644 --- a/Telegram/Telegram-iOS/en.lproj/Localizable.strings +++ b/Telegram/Telegram-iOS/en.lproj/Localizable.strings @@ -1921,6 +1921,7 @@ "Conversation.Unpin" = "Unpin"; "Conversation.Report" = "Report Spam"; "Conversation.PinnedMessage" = "Pinned Message"; +"Conversation.PinnedPreviousMessage" = "Previous Message"; "Conversation.Moderate.Delete" = "Delete Message"; "Conversation.Moderate.Ban" = "Ban User"; diff --git a/submodules/LegacyMediaPickerUI/Sources/LegacySuggestionContext.swift b/submodules/LegacyMediaPickerUI/Sources/LegacySuggestionContext.swift index 4580ff3d45..ab405bf084 100644 --- a/submodules/LegacyMediaPickerUI/Sources/LegacySuggestionContext.swift +++ b/submodules/LegacyMediaPickerUI/Sources/LegacySuggestionContext.swift @@ -14,7 +14,7 @@ public func legacySuggestionContext(context: AccountContext, peerId: PeerId, cha suggestionContext.userListSignal = { query in return SSignal { subscriber in if let query = query { - let disposable = searchPeerMembers(context: context, peerId: peerId, chatLocation: chatLocation, query: query).start(next: { peers in + let disposable = searchPeerMembers(context: context, peerId: peerId, chatLocation: chatLocation, query: query, scope: .mention).start(next: { peers in let users = NSMutableArray() for peer in peers { let user = TGUser() diff --git a/submodules/SearchPeerMembers/Sources/SearchPeerMembers.swift b/submodules/SearchPeerMembers/Sources/SearchPeerMembers.swift index a7b38b0465..df45680f8d 100644 --- a/submodules/SearchPeerMembers/Sources/SearchPeerMembers.swift +++ b/submodules/SearchPeerMembers/Sources/SearchPeerMembers.swift @@ -5,20 +5,25 @@ import SyncCore import SwiftSignalKit import AccountContext -public func searchPeerMembers(context: AccountContext, peerId: PeerId, chatLocation: ChatLocation, query: String) -> Signal<[Peer], NoError> { +public enum SearchPeerMembersScope { + case memberSuggestion + case mention +} + +public func searchPeerMembers(context: AccountContext, peerId: PeerId, chatLocation: ChatLocation, query: String, scope: SearchPeerMembersScope) -> Signal<[Peer], NoError> { if case .replyThread = chatLocation { return .single([]) } else if peerId.namespace == Namespaces.Peer.CloudChannel { return context.account.postbox.transaction { transaction -> CachedChannelData? in return transaction.getPeerCachedData(peerId: peerId) as? CachedChannelData } - |> mapToSignal { cachedData -> Signal<[Peer], NoError> in + |> mapToSignal { cachedData -> Signal<([Peer], Bool), NoError> in if let cachedData = cachedData, let memberCount = cachedData.participantsSummary.memberCount, memberCount <= 64 { return Signal { subscriber in let (disposable, _) = context.peerChannelMemberCategoriesContextsManager.recent(postbox: context.account.postbox, network: context.account.network, accountPeerId: context.account.peerId, peerId: peerId, searchQuery: nil, requestUpdate: false, updated: { state in if case .ready = state.loadingState { let normalizedQuery = query.lowercased() - subscriber.putNext(state.list.compactMap { participant -> Peer? in + subscriber.putNext((state.list.compactMap { participant -> Peer? in if participant.peer.isDeleted { return nil } @@ -37,7 +42,7 @@ public func searchPeerMembers(context: AccountContext, peerId: PeerId, chatLocat return nil } - }) + }, true)) } }) @@ -51,12 +56,12 @@ public func searchPeerMembers(context: AccountContext, peerId: PeerId, chatLocat return Signal { subscriber in let (disposable, _) = context.peerChannelMemberCategoriesContextsManager.recent(postbox: context.account.postbox, network: context.account.network, accountPeerId: context.account.peerId, peerId: peerId, searchQuery: query.isEmpty ? nil : query, updated: { state in if case .ready = state.loadingState { - subscriber.putNext(state.list.compactMap { participant in + subscriber.putNext((state.list.compactMap { participant in if participant.peer.isDeleted { return nil } return participant.peer - }) + }, true)) } }) @@ -65,6 +70,36 @@ public func searchPeerMembers(context: AccountContext, peerId: PeerId, chatLocat } } |> runOn(Queue.mainQueue()) } + |> mapToSignal { result, isReady -> Signal<[Peer], NoError> in + switch scope { + case .mention: + return .single(result) + case .memberSuggestion: + return context.account.postbox.transaction { transaction -> [Peer] in + var result = result + let normalizedQuery = query.lowercased() + if isReady { + if let channel = transaction.getPeer(peerId) as? TelegramChannel, case .group = channel.info { + var matches = false + if normalizedQuery.isEmpty { + matches = true + } else { + if channel.indexName.matchesByTokens(normalizedQuery) { + matches = true + } + if let addressName = channel.addressName, addressName.lowercased().hasPrefix(normalizedQuery) { + matches = true + } + } + if matches { + result.insert(channel, at: 0) + } + } + } + return result + } + } + } } else { return searchGroupMembers(postbox: context.account.postbox, network: context.account.network, accountPeerId: context.account.peerId, peerId: peerId, query: query) } diff --git a/submodules/TelegramApi/Sources/Api0.swift b/submodules/TelegramApi/Sources/Api0.swift index 8a137c3a69..dd824ff79f 100644 --- a/submodules/TelegramApi/Sources/Api0.swift +++ b/submodules/TelegramApi/Sources/Api0.swift @@ -322,6 +322,7 @@ fileprivate let parsers: [Int32 : (BufferReader) -> Any?] = { dict[106343499] = { return Api.ChannelParticipantsFilter.parse_channelParticipantsSearch($0) } dict[-1548400251] = { return Api.ChannelParticipantsFilter.parse_channelParticipantsKicked($0) } dict[-1150621555] = { return Api.ChannelParticipantsFilter.parse_channelParticipantsContacts($0) } + dict[915357814] = { return Api.ChannelParticipantsFilter.parse_channelParticipantsMentions($0) } dict[-350980120] = { return Api.WebPage.parse_webPageEmpty($0) } dict[-981018084] = { return Api.WebPage.parse_webPagePending($0) } dict[-392411726] = { return Api.WebPage.parse_webPage($0) } diff --git a/submodules/TelegramApi/Sources/Api1.swift b/submodules/TelegramApi/Sources/Api1.swift index 5a1cdb630c..8e35f0b9c5 100644 --- a/submodules/TelegramApi/Sources/Api1.swift +++ b/submodules/TelegramApi/Sources/Api1.swift @@ -9991,6 +9991,7 @@ public extension Api { case channelParticipantsSearch(q: String) case channelParticipantsKicked(q: String) case channelParticipantsContacts(q: String) + case channelParticipantsMentions(q: String) public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { @@ -10036,6 +10037,12 @@ public extension Api { } serializeString(q, buffer: buffer, boxed: false) break + case .channelParticipantsMentions(let q): + if boxed { + buffer.appendInt32(915357814) + } + serializeString(q, buffer: buffer, boxed: false) + break } } @@ -10055,6 +10062,8 @@ public extension Api { return ("channelParticipantsKicked", [("q", q)]) case .channelParticipantsContacts(let q): return ("channelParticipantsContacts", [("q", q)]) + case .channelParticipantsMentions(let q): + return ("channelParticipantsMentions", [("q", q)]) } } @@ -10111,6 +10120,17 @@ public extension Api { return nil } } + public static func parse_channelParticipantsMentions(_ reader: BufferReader) -> ChannelParticipantsFilter? { + var _1: String? + _1 = parseString(reader) + let _c1 = _1 != nil + if _c1 { + return Api.ChannelParticipantsFilter.channelParticipantsMentions(q: _1!) + } + else { + return nil + } + } } public enum WebPage: TypeConstructorDescription { diff --git a/submodules/TelegramApi/Sources/Api3.swift b/submodules/TelegramApi/Sources/Api3.swift index 330dc0faa3..e258ce144b 100644 --- a/submodules/TelegramApi/Sources/Api3.swift +++ b/submodules/TelegramApi/Sources/Api3.swift @@ -3737,9 +3737,26 @@ public extension Api { }) } - public static func search(flags: Int32, peer: Api.InputPeer, q: String, fromId: Api.InputUser?, topMsgId: Int32?, filter: Api.MessagesFilter, minDate: Int32, maxDate: Int32, offsetId: Int32, addOffset: Int32, limit: Int32, maxId: Int32, minId: Int32, hash: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func setTyping(flags: Int32, peer: Api.InputPeer, topMsgId: Int32?, action: Api.SendMessageAction) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() - buffer.appendInt32(1310163211) + buffer.appendInt32(1486110434) + serializeInt32(flags, buffer: buffer, boxed: false) + peer.serialize(buffer, true) + if Int(flags) & Int(1 << 0) != 0 {serializeInt32(topMsgId!, buffer: buffer, boxed: false)} + action.serialize(buffer, true) + return (FunctionDescription(name: "messages.setTyping", parameters: [("flags", flags), ("peer", peer), ("topMsgId", topMsgId), ("action", action)]), buffer, DeserializeFunctionResponse { (buffer: Buffer) -> Api.Bool? in + let reader = BufferReader(buffer) + var result: Api.Bool? + if let signature = reader.readInt32() { + result = Api.parse(reader, signature: signature) as? Api.Bool + } + return result + }) + } + + public static func search(flags: Int32, peer: Api.InputPeer, q: String, fromId: Api.InputPeer?, topMsgId: Int32?, filter: Api.MessagesFilter, minDate: Int32, maxDate: Int32, offsetId: Int32, addOffset: Int32, limit: Int32, maxId: Int32, minId: Int32, hash: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + let buffer = Buffer() + buffer.appendInt32(204812012) serializeInt32(flags, buffer: buffer, boxed: false) peer.serialize(buffer, true) serializeString(q, buffer: buffer, boxed: false) @@ -3763,23 +3780,6 @@ public extension Api { return result }) } - - public static func setTyping(flags: Int32, peer: Api.InputPeer, topMsgId: Int32?, action: Api.SendMessageAction) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { - let buffer = Buffer() - buffer.appendInt32(1486110434) - serializeInt32(flags, buffer: buffer, boxed: false) - peer.serialize(buffer, true) - if Int(flags) & Int(1 << 0) != 0 {serializeInt32(topMsgId!, buffer: buffer, boxed: false)} - action.serialize(buffer, true) - return (FunctionDescription(name: "messages.setTyping", parameters: [("flags", flags), ("peer", peer), ("topMsgId", topMsgId), ("action", action)]), buffer, DeserializeFunctionResponse { (buffer: Buffer) -> Api.Bool? in - let reader = BufferReader(buffer) - var result: Api.Bool? - if let signature = reader.readInt32() { - result = Api.parse(reader, signature: signature) as? Api.Bool - } - return result - }) - } } public struct channels { public static func readHistory(channel: Api.InputChannel, maxId: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { diff --git a/submodules/TelegramCore/Sources/SearchMessages.swift b/submodules/TelegramCore/Sources/SearchMessages.swift index 19eb12abc5..ecca1e4db0 100644 --- a/submodules/TelegramCore/Sources/SearchMessages.swift +++ b/submodules/TelegramCore/Sources/SearchMessages.swift @@ -221,11 +221,11 @@ public func searchMessages(account: Account, location: SearchMessagesLocation, q guard let inputPeer = apiInputPeer(peer) else { return .single((nil, nil)) } - var fromInputUser: Api.InputUser? = nil + var fromInputPeer: Api.InputPeer? = nil var flags: Int32 = 0 if let from = values.from { - fromInputUser = apiInputUser(from) - if let _ = fromInputUser { + fromInputPeer = apiInputPeer(from) + if let _ = fromInputPeer { flags |= (1 << 0) } } @@ -241,7 +241,7 @@ public func searchMessages(account: Account, location: SearchMessagesLocation, q if peer.id.namespace == Namespaces.Peer.CloudChannel && query.isEmpty && fromId == nil && tags == nil && minDate == nil && maxDate == nil { signal = account.network.request(Api.functions.messages.getHistory(peer: inputPeer, offsetId: lowerBound?.id.id ?? 0, offsetDate: 0, addOffset: 0, limit: limit, maxId: Int32.max - 1, minId: 0, hash: 0)) } else { - signal = account.network.request(Api.functions.messages.search(flags: flags, peer: inputPeer, q: query, fromId: fromInputUser, topMsgId: topMsgId?.id, filter: filter, minDate: minDate ?? 0, maxDate: maxDate ?? (Int32.max - 1), offsetId: lowerBound?.id.id ?? 0, addOffset: 0, limit: limit, maxId: Int32.max - 1, minId: 0, hash: 0)) + signal = account.network.request(Api.functions.messages.search(flags: flags, peer: inputPeer, q: query, fromId: fromInputPeer, topMsgId: topMsgId?.id, filter: filter, minDate: minDate ?? 0, maxDate: maxDate ?? (Int32.max - 1), offsetId: lowerBound?.id.id ?? 0, addOffset: 0, limit: limit, maxId: Int32.max - 1, minId: 0, hash: 0)) } peerMessages = signal |> map(Optional.init) @@ -257,7 +257,7 @@ public func searchMessages(account: Account, location: SearchMessagesLocation, q additionalPeerMessages = .single(nil) } else if mainCompleted || !hasAdditional { let lowerBound = state?.additional?.messages.last.flatMap({ $0.index }) - additionalPeerMessages = account.network.request(Api.functions.messages.search(flags: flags, peer: inputPeer, q: query, fromId: fromInputUser, topMsgId: topMsgId?.id, filter: filter, minDate: minDate ?? 0, maxDate: maxDate ?? (Int32.max - 1), offsetId: lowerBound?.id.id ?? 0, addOffset: 0, limit: limit, maxId: Int32.max - 1, minId: 0, hash: 0)) + additionalPeerMessages = account.network.request(Api.functions.messages.search(flags: flags, peer: inputPeer, q: query, fromId: fromInputPeer, topMsgId: topMsgId?.id, filter: filter, minDate: minDate ?? 0, maxDate: maxDate ?? (Int32.max - 1), offsetId: lowerBound?.id.id ?? 0, addOffset: 0, limit: limit, maxId: Int32.max - 1, minId: 0, hash: 0)) |> map(Optional.init) |> `catch` { _ -> Signal in return .single(nil) diff --git a/submodules/TelegramCore/Sources/Serialization.swift b/submodules/TelegramCore/Sources/Serialization.swift index 94cd1882c6..d03f659a53 100644 --- a/submodules/TelegramCore/Sources/Serialization.swift +++ b/submodules/TelegramCore/Sources/Serialization.swift @@ -210,7 +210,7 @@ public class BoxedMessage: NSObject { public class Serialization: NSObject, MTSerialization { public func currentLayer() -> UInt { - return 119 + return 120 } public func parseMessage(_ data: Data!) -> Any! { diff --git a/submodules/TelegramPresentationData/Sources/PresentationStrings.swift b/submodules/TelegramPresentationData/Sources/PresentationStrings.swift index c34a0efba7..02fa3946b6 100644 --- a/submodules/TelegramPresentationData/Sources/PresentationStrings.swift +++ b/submodules/TelegramPresentationData/Sources/PresentationStrings.swift @@ -4393,1390 +4393,1391 @@ public final class PresentationStrings: Equatable { } public var SettingsSearch_Synonyms_Notifications_BadgeIncludeMutedChannels: String { return self._s[3936]! } public var CallFeedback_VideoReasonLowQuality: String { return self._s[3937]! } - public var SocksProxySetup_AddProxyTitle: String { return self._s[3938]! } - public var Passport_Identity_AddInternalPassport: String { return self._s[3939]! } + public var Conversation_PinnedPreviousMessage: String { return self._s[3938]! } + public var SocksProxySetup_AddProxyTitle: String { return self._s[3939]! } + public var Passport_Identity_AddInternalPassport: String { return self._s[3940]! } public func ChatList_RemovedFromFolderTooltip(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3940]!, self._r[3940]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3941]!, self._r[3941]!, [_1, _2]) } public func Conversation_SetReminder_RemindToday(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3941]!, self._r[3941]!, [_0]) + return formatWithArgumentRanges(self._s[3942]!, self._r[3942]!, [_0]) } - public var Passport_Identity_GenderFemale: String { return self._s[3942]! } - public var ConvertToSupergroup_HelpTitle: String { return self._s[3945]! } - public var SharedMedia_TitleAll: String { return self._s[3946]! } - public var Settings_Context_Logout: String { return self._s[3947]! } - public var GroupInfo_SetGroupPhotoDelete: String { return self._s[3949]! } - public var Settings_About_Title: String { return self._s[3950]! } - public var StickerSettings_ContextHide: String { return self._s[3951]! } + public var Passport_Identity_GenderFemale: String { return self._s[3943]! } + public var ConvertToSupergroup_HelpTitle: String { return self._s[3946]! } + public var SharedMedia_TitleAll: String { return self._s[3947]! } + public var Settings_Context_Logout: String { return self._s[3948]! } + public var GroupInfo_SetGroupPhotoDelete: String { return self._s[3950]! } + public var Settings_About_Title: String { return self._s[3951]! } + public var StickerSettings_ContextHide: String { return self._s[3952]! } public func AutoDownloadSettings_UpTo(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3952]!, self._r[3952]!, [_0]) - } - public func Conversation_LiveLocationYouAndOther(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[3953]!, self._r[3953]!, [_0]) } - public var Common_Cancel: String { return self._s[3955]! } - public var CallFeedback_Title: String { return self._s[3957]! } - public func Notification_PinnedContactMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3958]!, self._r[3958]!, [_0]) + public func Conversation_LiveLocationYouAndOther(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3954]!, self._r[3954]!, [_0]) } - public var Activity_UploadingVideoMessage: String { return self._s[3959]! } - public var Wallet_TransactionInfo_OtherFeeInfo: String { return self._s[3960]! } - public var MediaPicker_Send: String { return self._s[3961]! } - public var PasscodeSettings_AutoLock_IfAwayFor_1minute: String { return self._s[3962]! } - public var Conversation_LiveLocationYou: String { return self._s[3963]! } - public var Notifications_ExceptionsUnmuted: String { return self._s[3964]! } + public var Common_Cancel: String { return self._s[3956]! } + public var CallFeedback_Title: String { return self._s[3958]! } + public func Notification_PinnedContactMessage(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3959]!, self._r[3959]!, [_0]) + } + public var Activity_UploadingVideoMessage: String { return self._s[3960]! } + public var Wallet_TransactionInfo_OtherFeeInfo: String { return self._s[3961]! } + public var MediaPicker_Send: String { return self._s[3962]! } + public var PasscodeSettings_AutoLock_IfAwayFor_1minute: String { return self._s[3963]! } + public var Conversation_LiveLocationYou: String { return self._s[3964]! } + public var Notifications_ExceptionsUnmuted: String { return self._s[3965]! } public func Channel_AdminLog_MessageGroupPreHistoryHidden(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3965]!, self._r[3965]!, [_0]) + return formatWithArgumentRanges(self._s[3966]!, self._r[3966]!, [_0]) } public func PUSH_CHAT_ADD_YOU(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3966]!, self._r[3966]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3967]!, self._r[3967]!, [_1, _2]) } - public var Conversation_ViewBackground: String { return self._s[3967]! } - public var ChatSettings_PrivateChats: String { return self._s[3970]! } - public var Conversation_ErrorInaccessibleMessage: String { return self._s[3971]! } - public var Wallet_Receive_AmountInfo: String { return self._s[3972]! } - public var Appearance_ThemeNight: String { return self._s[3973]! } - public var Common_Search: String { return self._s[3974]! } - public var TwoStepAuth_ReEnterPasswordTitle: String { return self._s[3975]! } - public var ChangePhoneNumberNumber_Help: String { return self._s[3977]! } - public var Stickers_SuggestAdded: String { return self._s[3978]! } - public var Conversation_DiscardVoiceMessageDescription: String { return self._s[3981]! } - public var NetworkUsageSettings_Cellular: String { return self._s[3982]! } - public var CheckoutInfo_Title: String { return self._s[3983]! } - public var Conversation_ShareBotLocationConfirmationTitle: String { return self._s[3984]! } - public var Channel_BotDoesntSupportGroups: String { return self._s[3985]! } + public var Conversation_ViewBackground: String { return self._s[3968]! } + public var ChatSettings_PrivateChats: String { return self._s[3971]! } + public var Conversation_ErrorInaccessibleMessage: String { return self._s[3972]! } + public var Wallet_Receive_AmountInfo: String { return self._s[3973]! } + public var Appearance_ThemeNight: String { return self._s[3974]! } + public var Common_Search: String { return self._s[3975]! } + public var TwoStepAuth_ReEnterPasswordTitle: String { return self._s[3976]! } + public var ChangePhoneNumberNumber_Help: String { return self._s[3978]! } + public var Stickers_SuggestAdded: String { return self._s[3979]! } + public var Conversation_DiscardVoiceMessageDescription: String { return self._s[3982]! } + public var NetworkUsageSettings_Cellular: String { return self._s[3983]! } + public var CheckoutInfo_Title: String { return self._s[3984]! } + public var Conversation_ShareBotLocationConfirmationTitle: String { return self._s[3985]! } + public var Channel_BotDoesntSupportGroups: String { return self._s[3986]! } public func DialogList_SingleRecordingAudioSuffix(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3986]!, self._r[3986]!, [_0]) + return formatWithArgumentRanges(self._s[3987]!, self._r[3987]!, [_0]) } - public var MaskStickerSettings_Info: String { return self._s[3987]! } - public var GroupRemoved_DeleteUser: String { return self._s[3988]! } - public var Contacts_ShareTelegram: String { return self._s[3989]! } - public var Group_UpgradeNoticeText1: String { return self._s[3990]! } + public var MaskStickerSettings_Info: String { return self._s[3988]! } + public var GroupRemoved_DeleteUser: String { return self._s[3989]! } + public var Contacts_ShareTelegram: String { return self._s[3990]! } + public var Group_UpgradeNoticeText1: String { return self._s[3991]! } public func PUSH_PHONE_CALL_REQUEST(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3991]!, self._r[3991]!, [_1]) + return formatWithArgumentRanges(self._s[3992]!, self._r[3992]!, [_1]) } - public var PrivacyLastSeenSettings_Title: String { return self._s[3992]! } - public var SettingsSearch_Synonyms_Support: String { return self._s[3996]! } - public var PhotoEditor_TintTool: String { return self._s[3997]! } - public var Wallet_Receive_InvoiceUrlHeader: String { return self._s[3999]! } - public var GroupPermission_NoSendPolls: String { return self._s[4000]! } - public var NotificationsSound_None: String { return self._s[4001]! } + public var PrivacyLastSeenSettings_Title: String { return self._s[3993]! } + public var SettingsSearch_Synonyms_Support: String { return self._s[3997]! } + public var PhotoEditor_TintTool: String { return self._s[3998]! } + public var Wallet_Receive_InvoiceUrlHeader: String { return self._s[4000]! } + public var GroupPermission_NoSendPolls: String { return self._s[4001]! } + public var NotificationsSound_None: String { return self._s[4002]! } public func LOCAL_CHANNEL_MESSAGE_FWDS(_ _1: String, _ _2: Int) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4002]!, self._r[4002]!, [_1, "\(_2)"]) + return formatWithArgumentRanges(self._s[4003]!, self._r[4003]!, [_1, "\(_2)"]) } - public var CheckoutInfo_ShippingInfoCityPlaceholder: String { return self._s[4004]! } - public var ExplicitContent_AlertChannel: String { return self._s[4006]! } - public var Conversation_ClousStorageInfo_Description1: String { return self._s[4007]! } - public var Contacts_SortedByPresence: String { return self._s[4008]! } - public var WallpaperSearch_ColorGray: String { return self._s[4009]! } - public var Channel_AdminLogFilter_EventsNewSubscribers: String { return self._s[4010]! } - public var Conversation_ReportSpam: String { return self._s[4011]! } - public var ChatList_Search_NoResultsFilter: String { return self._s[4014]! } - public var WallpaperSearch_ColorBlack: String { return self._s[4015]! } - public var ArchivedChats_IntroTitle3: String { return self._s[4016]! } - public var Conversation_DefaultRestrictedText: String { return self._s[4017]! } - public var Settings_Devices: String { return self._s[4018]! } - public var Call_AudioRouteSpeaker: String { return self._s[4019]! } - public var GroupInfo_InviteLink_CopyLink: String { return self._s[4020]! } - public var Passport_Address_Country: String { return self._s[4022]! } - public var Cache_MaximumCacheSize: String { return self._s[4023]! } - public var Notifications_Badge_IncludePublicGroups: String { return self._s[4024]! } - public var Wallet_Receive_CreateInvoice: String { return self._s[4026]! } - public var ChatSettings_AutoDownloadUsingWiFi: String { return self._s[4027]! } - public var Login_TermsOfServiceLabel: String { return self._s[4028]! } - public var Calls_NoMissedCallsPlacehoder: String { return self._s[4029]! } - public var SocksProxySetup_RequiredCredentials: String { return self._s[4030]! } - public var VoiceOver_MessageContextOpenMessageMenu: String { return self._s[4031]! } - public var AutoNightTheme_ScheduledFrom: String { return self._s[4032]! } - public var ChatSettings_AutoDownloadDocuments: String { return self._s[4033]! } - public var ConvertToSupergroup_Note: String { return self._s[4035]! } - public var Settings_SetNewProfilePhotoOrVideo: String { return self._s[4036]! } - public var PrivacySettings_PasscodeAndTouchId: String { return self._s[4037]! } - public var Common_More: String { return self._s[4038]! } - public var ShareMenu_SelectChats: String { return self._s[4040]! } + public var CheckoutInfo_ShippingInfoCityPlaceholder: String { return self._s[4005]! } + public var ExplicitContent_AlertChannel: String { return self._s[4007]! } + public var Conversation_ClousStorageInfo_Description1: String { return self._s[4008]! } + public var Contacts_SortedByPresence: String { return self._s[4009]! } + public var WallpaperSearch_ColorGray: String { return self._s[4010]! } + public var Channel_AdminLogFilter_EventsNewSubscribers: String { return self._s[4011]! } + public var Conversation_ReportSpam: String { return self._s[4012]! } + public var ChatList_Search_NoResultsFilter: String { return self._s[4015]! } + public var WallpaperSearch_ColorBlack: String { return self._s[4016]! } + public var ArchivedChats_IntroTitle3: String { return self._s[4017]! } + public var Conversation_DefaultRestrictedText: String { return self._s[4018]! } + public var Settings_Devices: String { return self._s[4019]! } + public var Call_AudioRouteSpeaker: String { return self._s[4020]! } + public var GroupInfo_InviteLink_CopyLink: String { return self._s[4021]! } + public var Passport_Address_Country: String { return self._s[4023]! } + public var Cache_MaximumCacheSize: String { return self._s[4024]! } + public var Notifications_Badge_IncludePublicGroups: String { return self._s[4025]! } + public var Wallet_Receive_CreateInvoice: String { return self._s[4027]! } + public var ChatSettings_AutoDownloadUsingWiFi: String { return self._s[4028]! } + public var Login_TermsOfServiceLabel: String { return self._s[4029]! } + public var Calls_NoMissedCallsPlacehoder: String { return self._s[4030]! } + public var SocksProxySetup_RequiredCredentials: String { return self._s[4031]! } + public var VoiceOver_MessageContextOpenMessageMenu: String { return self._s[4032]! } + public var AutoNightTheme_ScheduledFrom: String { return self._s[4033]! } + public var ChatSettings_AutoDownloadDocuments: String { return self._s[4034]! } + public var ConvertToSupergroup_Note: String { return self._s[4036]! } + public var Settings_SetNewProfilePhotoOrVideo: String { return self._s[4037]! } + public var PrivacySettings_PasscodeAndTouchId: String { return self._s[4038]! } + public var Common_More: String { return self._s[4039]! } + public var ShareMenu_SelectChats: String { return self._s[4041]! } public func Conversation_ScheduleMessage_SendToday(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4042]!, self._r[4042]!, [_0]) - } - public func Channel_AdminLog_MessageRemovedGroupStickerPack(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[4043]!, self._r[4043]!, [_0]) } - public var Contacts_PermissionsKeepDisabled: String { return self._s[4045]! } + public func Channel_AdminLog_MessageRemovedGroupStickerPack(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[4044]!, self._r[4044]!, [_0]) + } + public var Contacts_PermissionsKeepDisabled: String { return self._s[4046]! } public func Call_ParticipantVersionOutdatedError(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4046]!, self._r[4046]!, [_0]) + return formatWithArgumentRanges(self._s[4047]!, self._r[4047]!, [_0]) } - public var WatchRemote_AlertOpen: String { return self._s[4047]! } + public var WatchRemote_AlertOpen: String { return self._s[4048]! } public func PUSH_CHAT_ADD_MEMBER(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4048]!, self._r[4048]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[4049]!, self._r[4049]!, [_1, _2, _3]) } - public var Channel_Members_AddMembersHelp: String { return self._s[4049]! } - public var Shortcut_SwitchAccount: String { return self._s[4050]! } - public var Map_LiveLocationFor8Hours: String { return self._s[4051]! } + public var Channel_Members_AddMembersHelp: String { return self._s[4050]! } + public var Shortcut_SwitchAccount: String { return self._s[4051]! } + public var Map_LiveLocationFor8Hours: String { return self._s[4052]! } public func AutoNightTheme_AutomaticHelp(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4052]!, self._r[4052]!, [_0]) + return formatWithArgumentRanges(self._s[4053]!, self._r[4053]!, [_0]) } - public var Compose_NewGroupTitle: String { return self._s[4053]! } - public var DialogList_You: String { return self._s[4054]! } - public var ReportPeer_ReasonViolence: String { return self._s[4055]! } + public var Compose_NewGroupTitle: String { return self._s[4054]! } + public var DialogList_You: String { return self._s[4055]! } + public var ReportPeer_ReasonViolence: String { return self._s[4056]! } public func PUSH_CHANNEL_MESSAGE_STICKER(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4056]!, self._r[4056]!, [_1, _2]) + return formatWithArgumentRanges(self._s[4057]!, self._r[4057]!, [_1, _2]) } - public var KeyCommand_ScrollDown: String { return self._s[4060]! } - public var ChatSettings_DownloadInBackground: String { return self._s[4061]! } - public var Wallpaper_ResetWallpapers: String { return self._s[4062]! } - public var Channel_BanList_RestrictedTitle: String { return self._s[4063]! } - public var ArchivedChats_IntroText3: String { return self._s[4064]! } - public var HashtagSearch_AllChats: String { return self._s[4066]! } - public var Channel_Info_BlackList: String { return self._s[4068]! } - public var Contacts_SearchUsersAndGroupsLabel: String { return self._s[4069]! } - public var PrivacyPhoneNumberSettings_DiscoveryHeader: String { return self._s[4070]! } - public var Paint_Neon: String { return self._s[4072]! } - public var SettingsSearch_Synonyms_AppLanguage: String { return self._s[4073]! } - public var AutoDownloadSettings_AutoDownload: String { return self._s[4074]! } + public var KeyCommand_ScrollDown: String { return self._s[4061]! } + public var ChatSettings_DownloadInBackground: String { return self._s[4062]! } + public var Wallpaper_ResetWallpapers: String { return self._s[4063]! } + public var Channel_BanList_RestrictedTitle: String { return self._s[4064]! } + public var ArchivedChats_IntroText3: String { return self._s[4065]! } + public var HashtagSearch_AllChats: String { return self._s[4067]! } + public var Channel_Info_BlackList: String { return self._s[4069]! } + public var Contacts_SearchUsersAndGroupsLabel: String { return self._s[4070]! } + public var PrivacyPhoneNumberSettings_DiscoveryHeader: String { return self._s[4071]! } + public var Paint_Neon: String { return self._s[4073]! } + public var SettingsSearch_Synonyms_AppLanguage: String { return self._s[4074]! } + public var AutoDownloadSettings_AutoDownload: String { return self._s[4075]! } public func Notification_PinnedVideoMessage(_ _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 Map_StopLiveLocation: String { return self._s[4077]! } - public var SettingsSearch_Synonyms_Data_SaveEditedPhotos: String { return self._s[4078]! } - public var Channel_Username_InvalidCharacters: String { return self._s[4079]! } - public var InstantPage_Reference: String { return self._s[4080]! } - public var ChatList_HideAction: String { return self._s[4082]! } - public var Conversation_FileICloudDrive: String { return self._s[4084]! } + public var Map_StopLiveLocation: String { return self._s[4078]! } + public var SettingsSearch_Synonyms_Data_SaveEditedPhotos: String { return self._s[4079]! } + public var Channel_Username_InvalidCharacters: String { return self._s[4080]! } + public var InstantPage_Reference: String { return self._s[4081]! } + public var ChatList_HideAction: String { return self._s[4083]! } + public var Conversation_FileICloudDrive: String { return self._s[4085]! } public func PUSH_PINNED_GEOLIVE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4085]!, self._r[4085]!, [_1]) + return formatWithArgumentRanges(self._s[4086]!, self._r[4086]!, [_1]) } - public var Passport_PasswordReset: String { return self._s[4087]! } - public var ChatList_Context_UnhideArchive: String { return self._s[4089]! } - public var ConvertToSupergroup_HelpText: String { return self._s[4090]! } - public var Calls_AddTab: String { return self._s[4091]! } - public var TwoStepAuth_ConfirmEmailResendCode: String { return self._s[4092]! } - public var SettingsSearch_Synonyms_Stickers_SuggestStickers: String { return self._s[4093]! } - public var Privacy_GroupsAndChannels: String { return self._s[4095]! } - public var AutoNightTheme_Disabled: String { return self._s[4096]! } - public var CreatePoll_MultipleChoice: String { return self._s[4097]! } + public var Passport_PasswordReset: String { return self._s[4088]! } + public var ChatList_Context_UnhideArchive: String { return self._s[4090]! } + public var ConvertToSupergroup_HelpText: String { return self._s[4091]! } + public var Calls_AddTab: String { return self._s[4092]! } + public var TwoStepAuth_ConfirmEmailResendCode: String { return self._s[4093]! } + public var SettingsSearch_Synonyms_Stickers_SuggestStickers: String { return self._s[4094]! } + public var Privacy_GroupsAndChannels: String { return self._s[4096]! } + public var AutoNightTheme_Disabled: String { return self._s[4097]! } + public var CreatePoll_MultipleChoice: String { return self._s[4098]! } public func PINNED_INVOICE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4098]!, self._r[4098]!, [_1]) + return formatWithArgumentRanges(self._s[4099]!, self._r[4099]!, [_1]) } - public var Watch_Bot_Restart: String { return self._s[4100]! } + public var Watch_Bot_Restart: String { return self._s[4101]! } public func Conversation_Kilobytes(_ _0: Int) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4101]!, self._r[4101]!, ["\(_0)"]) + return formatWithArgumentRanges(self._s[4102]!, self._r[4102]!, ["\(_0)"]) } - public var GroupInfo_ScamGroupWarning: String { return self._s[4102]! } - public var Conversation_EditingMessagePanelMedia: String { return self._s[4103]! } - public var Appearance_PreviewIncomingText: String { return self._s[4104]! } - public var Notifications_ChannelNotificationsExceptionsHelp: String { return self._s[4105]! } - public var ChatList_UndoArchiveRevealedTitle: String { return self._s[4107]! } - public var Stats_GroupOverview: String { return self._s[4109]! } - public var ScheduledMessages_EditTime: String { return self._s[4111]! } - public var Month_GenFebruary: String { return self._s[4112]! } - public var ChatList_AutoarchiveSuggestion_OpenSettings: String { return self._s[4113]! } - public var Stickers_ClearRecent: String { return self._s[4114]! } - public var TwoStepAuth_EnterPasswordPassword: String { return self._s[4115]! } + public var GroupInfo_ScamGroupWarning: String { return self._s[4103]! } + public var Conversation_EditingMessagePanelMedia: String { return self._s[4104]! } + public var Appearance_PreviewIncomingText: String { return self._s[4105]! } + public var Notifications_ChannelNotificationsExceptionsHelp: String { return self._s[4106]! } + public var ChatList_UndoArchiveRevealedTitle: String { return self._s[4108]! } + public var Stats_GroupOverview: String { return self._s[4110]! } + public var ScheduledMessages_EditTime: String { return self._s[4112]! } + public var Month_GenFebruary: String { return self._s[4113]! } + public var ChatList_AutoarchiveSuggestion_OpenSettings: String { return self._s[4114]! } + public var Stickers_ClearRecent: String { return self._s[4115]! } + public var TwoStepAuth_EnterPasswordPassword: String { return self._s[4116]! } public func Checkout_PayPrice(_ _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 Login_TermsOfServiceSignupDecline: String { return self._s[4117]! } - public var CheckoutInfo_ErrorCityInvalid: String { return self._s[4118]! } - public var VoiceOver_Chat_PlayHint: String { return self._s[4119]! } - public var ChatAdmins_AllMembersAreAdminsOffHelp: String { return self._s[4120]! } - public var CheckoutInfo_ShippingInfoTitle: String { return self._s[4122]! } - public var CreatePoll_Create: String { return self._s[4123]! } - public var ChatList_Search_FilterLinks: String { return self._s[4124]! } - public var Your_cards_number_is_invalid: String { return self._s[4125]! } - public var Month_ShortApril: String { return self._s[4126]! } - public var SocksProxySetup_UseForCalls: String { return self._s[4127]! } - public var Conversation_EditingCaptionPanelTitle: String { return self._s[4128]! } - public var SocksProxySetup_Status: String { return self._s[4129]! } - public var ChannelInfo_DeleteGroupConfirmation: String { return self._s[4130]! } - public var ChatListFolder_CategoryBots: String { return self._s[4131]! } - public var Passport_FieldIdentitySelfieHelp: String { return self._s[4133]! } - public var GroupInfo_BroadcastListNamePlaceholder: String { return self._s[4134]! } - public var Wallpaper_ResetWallpapersInfo: String { return self._s[4135]! } - public var Conversation_TitleUnmute: String { return self._s[4136]! } - public var Group_Setup_TypeHeader: String { return self._s[4137]! } - public var Stats_ViewsPerPost: String { return self._s[4138]! } - public var CheckoutInfo_ShippingInfoCountry: String { return self._s[4139]! } - public var Passport_Identity_TranslationHelp: String { return self._s[4140]! } + public var Login_TermsOfServiceSignupDecline: String { return self._s[4118]! } + public var CheckoutInfo_ErrorCityInvalid: String { return self._s[4119]! } + public var VoiceOver_Chat_PlayHint: String { return self._s[4120]! } + public var ChatAdmins_AllMembersAreAdminsOffHelp: String { return self._s[4121]! } + public var CheckoutInfo_ShippingInfoTitle: String { return self._s[4123]! } + public var CreatePoll_Create: String { return self._s[4124]! } + public var ChatList_Search_FilterLinks: String { return self._s[4125]! } + public var Your_cards_number_is_invalid: String { return self._s[4126]! } + public var Month_ShortApril: String { return self._s[4127]! } + public var SocksProxySetup_UseForCalls: String { return self._s[4128]! } + public var Conversation_EditingCaptionPanelTitle: String { return self._s[4129]! } + public var SocksProxySetup_Status: String { return self._s[4130]! } + public var ChannelInfo_DeleteGroupConfirmation: String { return self._s[4131]! } + public var ChatListFolder_CategoryBots: String { return self._s[4132]! } + public var Passport_FieldIdentitySelfieHelp: String { return self._s[4134]! } + public var GroupInfo_BroadcastListNamePlaceholder: String { return self._s[4135]! } + public var Wallpaper_ResetWallpapersInfo: String { return self._s[4136]! } + public var Conversation_TitleUnmute: String { return self._s[4137]! } + public var Group_Setup_TypeHeader: String { return self._s[4138]! } + public var Stats_ViewsPerPost: String { return self._s[4139]! } + public var CheckoutInfo_ShippingInfoCountry: String { return self._s[4140]! } + public var Passport_Identity_TranslationHelp: String { return self._s[4141]! } public func PUSH_CHANNEL_MESSAGE_FWD(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4141]!, self._r[4141]!, [_1]) + return formatWithArgumentRanges(self._s[4142]!, self._r[4142]!, [_1]) } - public var GroupInfo_Administrators_Title: String { return self._s[4142]! } + public var GroupInfo_Administrators_Title: String { return self._s[4143]! } public func Channel_AdminLog_MessageRankName(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4143]!, self._r[4143]!, [_1, _2]) + return formatWithArgumentRanges(self._s[4144]!, self._r[4144]!, [_1, _2]) } public func PUSH_CHAT_MESSAGE_POLL(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4144]!, self._r[4144]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[4145]!, self._r[4145]!, [_1, _2, _3]) } - public var Wallet_Receive_Title: String { return self._s[4145]! } - public var CheckoutInfo_ShippingInfoState: String { return self._s[4146]! } - public var Passport_Language_my: String { return self._s[4148]! } - public var PrivacyLastSeenSettings_AlwaysShareWith_Title: String { return self._s[4149]! } - public var Map_PlacesNearby: String { return self._s[4150]! } - public var Channel_About_Help: String { return self._s[4151]! } - public var LogoutOptions_AddAccountTitle: String { return self._s[4152]! } - public var ChatSettings_AutomaticAudioDownload: String { return self._s[4153]! } - public var Channel_Username_Title: String { return self._s[4154]! } - public var Activity_RecordingVideoMessage: String { return self._s[4155]! } + public var Wallet_Receive_Title: String { return self._s[4146]! } + public var CheckoutInfo_ShippingInfoState: String { return self._s[4147]! } + public var Passport_Language_my: String { return self._s[4149]! } + public var PrivacyLastSeenSettings_AlwaysShareWith_Title: String { return self._s[4150]! } + public var Map_PlacesNearby: String { return self._s[4151]! } + public var Channel_About_Help: String { return self._s[4152]! } + public var LogoutOptions_AddAccountTitle: String { return self._s[4153]! } + public var ChatSettings_AutomaticAudioDownload: String { return self._s[4154]! } + public var Channel_Username_Title: String { return self._s[4155]! } + public var Activity_RecordingVideoMessage: String { return self._s[4156]! } public func StickerPackActionInfo_RemovedText(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4156]!, self._r[4156]!, [_0]) + return formatWithArgumentRanges(self._s[4157]!, self._r[4157]!, [_0]) } - public var CheckoutInfo_ShippingInfoCity: String { return self._s[4157]! } - public var Passport_DiscardMessageDescription: String { return self._s[4158]! } - public var Conversation_LinkDialogOpen: String { return self._s[4159]! } - public var ChatList_Context_HideArchive: String { return self._s[4160]! } + public var CheckoutInfo_ShippingInfoCity: String { return self._s[4158]! } + public var Passport_DiscardMessageDescription: String { return self._s[4159]! } + public var Conversation_LinkDialogOpen: String { return self._s[4160]! } + public var ChatList_Context_HideArchive: String { return self._s[4161]! } public func Message_AuthorPinnedGame(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4161]!, self._r[4161]!, [_0]) + return formatWithArgumentRanges(self._s[4162]!, self._r[4162]!, [_0]) } - public var Privacy_GroupsAndChannels_CustomShareHelp: String { return self._s[4162]! } - public var Conversation_Admin: String { return self._s[4163]! } - public var DialogList_TabTitle: String { return self._s[4164]! } + public var Privacy_GroupsAndChannels_CustomShareHelp: String { return self._s[4163]! } + public var Conversation_Admin: String { return self._s[4164]! } + public var DialogList_TabTitle: String { return self._s[4165]! } public func PUSH_CHAT_ALBUM(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4165]!, self._r[4165]!, [_1, _2]) + return formatWithArgumentRanges(self._s[4166]!, self._r[4166]!, [_1, _2]) } - public var Notifications_PermissionsUnreachableText: String { return self._s[4166]! } - public var Passport_Identity_GenderMale: String { return self._s[4168]! } - public var SettingsSearch_Synonyms_Privacy_BlockedUsers: String { return self._s[4170]! } - public var PhoneNumberHelp_Alert: String { return self._s[4171]! } - public var EnterPasscode_EnterNewPasscodeChange: String { return self._s[4172]! } - public var Notifications_InAppNotifications: String { return self._s[4173]! } + public var Notifications_PermissionsUnreachableText: String { return self._s[4167]! } + public var Passport_Identity_GenderMale: String { return self._s[4169]! } + public var SettingsSearch_Synonyms_Privacy_BlockedUsers: String { return self._s[4171]! } + public var PhoneNumberHelp_Alert: String { return self._s[4172]! } + public var EnterPasscode_EnterNewPasscodeChange: String { return self._s[4173]! } + public var Notifications_InAppNotifications: String { return self._s[4174]! } public func Update_AppVersion(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4174]!, self._r[4174]!, [_0]) + return formatWithArgumentRanges(self._s[4175]!, self._r[4175]!, [_0]) } - public var Notification_VideoCallOutgoing: String { return self._s[4175]! } - public var Login_InvalidCodeError: String { return self._s[4176]! } - public var Conversation_PrivateChannelTimeLimitedAlertJoin: String { return self._s[4177]! } + public var Notification_VideoCallOutgoing: String { return self._s[4176]! } + public var Login_InvalidCodeError: String { return self._s[4177]! } + public var Conversation_PrivateChannelTimeLimitedAlertJoin: String { return self._s[4178]! } public func LastSeen_TodayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4178]!, self._r[4178]!, [_0]) + return formatWithArgumentRanges(self._s[4179]!, self._r[4179]!, [_0]) } - public var Conversation_InputTextCaptionPlaceholder: String { return self._s[4179]! } - public var ReportPeer_Report: String { return self._s[4180]! } - public var Camera_FlashOff: String { return self._s[4182]! } - public var Conversation_InputTextBroadcastPlaceholder: String { return self._s[4185]! } - public var PrivacyPolicy_DeclineTitle: String { return self._s[4187]! } - public var SettingsSearch_Synonyms_Privacy_PasscodeAndTouchId: String { return self._s[4188]! } - public var Passport_FieldEmail: String { return self._s[4189]! } + public var Conversation_InputTextCaptionPlaceholder: String { return self._s[4180]! } + public var ReportPeer_Report: String { return self._s[4181]! } + public var Camera_FlashOff: String { return self._s[4183]! } + public var Conversation_InputTextBroadcastPlaceholder: String { return self._s[4186]! } + public var PrivacyPolicy_DeclineTitle: String { return self._s[4188]! } + public var SettingsSearch_Synonyms_Privacy_PasscodeAndTouchId: String { return self._s[4189]! } + public var Passport_FieldEmail: String { return self._s[4190]! } public func Channel_AdminLog_MessageKickedName(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4190]!, self._r[4190]!, [_1]) + return formatWithArgumentRanges(self._s[4191]!, self._r[4191]!, [_1]) } - public var Notifications_ExceptionsResetToDefaults: String { return self._s[4191]! } - public var PeerInfo_PaneVoiceAndVideo: String { return self._s[4192]! } - public var Group_OwnershipTransfer_Title: String { return self._s[4193]! } - public var Conversation_DefaultRestrictedInline: String { return self._s[4194]! } - public var Login_PhoneNumberHelp: String { return self._s[4196]! } - public var Channel_AdminLogFilter_EventsNewMembers: String { return self._s[4197]! } - public var Conversation_PinnedQuiz: String { return self._s[4198]! } - public var CreateGroup_SoftUserLimitAlert: String { return self._s[4199]! } - public var Login_PhoneNumberAlreadyAuthorizedSwitch: String { return self._s[4200]! } - public var Group_MessagePhotoUpdated: String { return self._s[4201]! } - public var LoginPassword_PasswordPlaceholder: String { return self._s[4202]! } - public var Passport_Identity_Translations: String { return self._s[4204]! } - public var ChatAdmins_AllMembersAreAdmins: String { return self._s[4205]! } - public var ChannelInfo_DeleteChannel: String { return self._s[4207]! } - public var PasscodeSettings_HelpBottom: String { return self._s[4208]! } - public var Channel_Members_AddMembers: String { return self._s[4209]! } - public var AutoDownloadSettings_LastDelimeter: String { return self._s[4210]! } - public var Notification_Exceptions_DeleteAllConfirmation: String { return self._s[4212]! } - public var Conversation_HoldForAudio: String { return self._s[4213]! } - public var Watch_LastSeen_Lately: String { return self._s[4215]! } - public var ChatList_Context_MarkAsRead: String { return self._s[4216]! } - public var Conversation_PinnedMessage: String { return self._s[4217]! } - public var SettingsSearch_Synonyms_Appearance_ColorTheme: String { return self._s[4218]! } - public var Passport_UpdateRequiredError: String { return self._s[4220]! } - public var PrivacySettings_Passcode: String { return self._s[4221]! } + public var Notifications_ExceptionsResetToDefaults: String { return self._s[4192]! } + public var PeerInfo_PaneVoiceAndVideo: String { return self._s[4193]! } + public var Group_OwnershipTransfer_Title: String { return self._s[4194]! } + public var Conversation_DefaultRestrictedInline: String { return self._s[4195]! } + public var Login_PhoneNumberHelp: String { return self._s[4197]! } + public var Channel_AdminLogFilter_EventsNewMembers: String { return self._s[4198]! } + public var Conversation_PinnedQuiz: String { return self._s[4199]! } + public var CreateGroup_SoftUserLimitAlert: String { return self._s[4200]! } + public var Login_PhoneNumberAlreadyAuthorizedSwitch: String { return self._s[4201]! } + public var Group_MessagePhotoUpdated: String { return self._s[4202]! } + public var LoginPassword_PasswordPlaceholder: String { return self._s[4203]! } + public var Passport_Identity_Translations: String { return self._s[4205]! } + public var ChatAdmins_AllMembersAreAdmins: String { return self._s[4206]! } + public var ChannelInfo_DeleteChannel: String { return self._s[4208]! } + public var PasscodeSettings_HelpBottom: String { return self._s[4209]! } + public var Channel_Members_AddMembers: String { return self._s[4210]! } + public var AutoDownloadSettings_LastDelimeter: String { return self._s[4211]! } + public var Notification_Exceptions_DeleteAllConfirmation: String { return self._s[4213]! } + public var Conversation_HoldForAudio: String { return self._s[4214]! } + public var Watch_LastSeen_Lately: String { return self._s[4216]! } + public var ChatList_Context_MarkAsRead: String { return self._s[4217]! } + public var Conversation_PinnedMessage: String { return self._s[4218]! } + public var SettingsSearch_Synonyms_Appearance_ColorTheme: String { return self._s[4219]! } + public var Passport_UpdateRequiredError: String { return self._s[4221]! } + public var PrivacySettings_Passcode: String { return self._s[4222]! } public func Call_EmojiDescription(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4222]!, self._r[4222]!, [_0]) + return formatWithArgumentRanges(self._s[4223]!, self._r[4223]!, [_0]) } - public var AutoNightTheme_NotAvailable: String { return self._s[4223]! } - public var Conversation_PressVolumeButtonForSound: String { return self._s[4224]! } - public var LoginPassword_InvalidPasswordError: String { return self._s[4225]! } - public var ChatListFolder_IncludedSectionHeader: String { return self._s[4226]! } - public var Channel_SignMessages_Help: String { return self._s[4227]! } - public var ChatList_DeleteForEveryoneConfirmationTitle: String { return self._s[4228]! } - public var Conversation_TitleNoComments: String { return self._s[4229]! } - public var MediaPicker_LivePhotoDescription: String { return self._s[4230]! } - public var GroupInfo_Permissions: String { return self._s[4231]! } - public var GroupPermission_NoSendLinks: String { return self._s[4234]! } - public var Passport_Identity_ResidenceCountry: String { return self._s[4235]! } - public var Appearance_ThemeCarouselNightBlue: String { return self._s[4237]! } - public var ChatList_ArchiveAction: String { return self._s[4238]! } + public var AutoNightTheme_NotAvailable: String { return self._s[4224]! } + public var Conversation_PressVolumeButtonForSound: String { return self._s[4225]! } + public var LoginPassword_InvalidPasswordError: String { return self._s[4226]! } + public var ChatListFolder_IncludedSectionHeader: String { return self._s[4227]! } + public var Channel_SignMessages_Help: String { return self._s[4228]! } + public var ChatList_DeleteForEveryoneConfirmationTitle: String { return self._s[4229]! } + public var Conversation_TitleNoComments: String { return self._s[4230]! } + public var MediaPicker_LivePhotoDescription: String { return self._s[4231]! } + public var GroupInfo_Permissions: String { return self._s[4232]! } + public var GroupPermission_NoSendLinks: String { return self._s[4235]! } + public var Passport_Identity_ResidenceCountry: String { return self._s[4236]! } + public var Appearance_ThemeCarouselNightBlue: String { return self._s[4238]! } + public var ChatList_ArchiveAction: String { return self._s[4239]! } public func Channel_AdminLog_DisabledSlowmode(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4239]!, self._r[4239]!, [_0]) + return formatWithArgumentRanges(self._s[4240]!, self._r[4240]!, [_0]) } - public var GroupInfo_GroupHistory: String { return self._s[4240]! } + public var GroupInfo_GroupHistory: String { return self._s[4241]! } public func Channel_Management_ErrorNotMember(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4242]!, self._r[4242]!, [_0]) + return formatWithArgumentRanges(self._s[4243]!, self._r[4243]!, [_0]) } - public var Privacy_Forwards_LinkIfAllowed: String { return self._s[4244]! } - public var Channel_Info_Banned: String { return self._s[4245]! } - public var Paint_RecentStickers: String { return self._s[4246]! } - public var VoiceOver_MessageContextSend: String { return self._s[4247]! } - public var Group_ErrorNotMutualContact: String { return self._s[4248]! } - public var ReportPeer_ReasonOther: String { return self._s[4250]! } - public var Channel_BanUser_PermissionChangeGroupInfo: String { return self._s[4251]! } - public var SocksProxySetup_ShareQRCodeInfo: String { return self._s[4253]! } - public var KeyCommand_Find: String { return self._s[4254]! } + public var Privacy_Forwards_LinkIfAllowed: String { return self._s[4245]! } + public var Channel_Info_Banned: String { return self._s[4246]! } + public var Paint_RecentStickers: String { return self._s[4247]! } + public var VoiceOver_MessageContextSend: String { return self._s[4248]! } + public var Group_ErrorNotMutualContact: String { return self._s[4249]! } + public var ReportPeer_ReasonOther: String { return self._s[4251]! } + public var Channel_BanUser_PermissionChangeGroupInfo: String { return self._s[4252]! } + public var SocksProxySetup_ShareQRCodeInfo: String { return self._s[4254]! } + public var KeyCommand_Find: String { return self._s[4255]! } public func Channel_MessageTitleUpdated(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4255]!, self._r[4255]!, [_0]) + return formatWithArgumentRanges(self._s[4256]!, self._r[4256]!, [_0]) } - public var ChatList_Context_Unmute: String { return self._s[4256]! } - public var Chat_SlowmodeAttachmentLimitReached: String { return self._s[4257]! } - public var Stickers_GroupStickersHelp: String { return self._s[4258]! } - public var Wallet_Configuration_BlockchainIdPlaceholder: String { return self._s[4259]! } - public var Checkout_Title: String { return self._s[4260]! } - public var Activity_RecordingAudio: String { return self._s[4261]! } - public var SettingsSearch_Synonyms_Notifications_GroupNotificationsPreview: String { return self._s[4262]! } - public var BlockedUsers_BlockTitle: String { return self._s[4263]! } - public var Wallet_Month_ShortFebruary: String { return self._s[4265]! } - public var Calls_All: String { return self._s[4266]! } - public var DialogList_SavedMessagesHelp: String { return self._s[4268]! } - public var Settings_FAQ_Button: String { return self._s[4269]! } + public var ChatList_Context_Unmute: String { return self._s[4257]! } + public var Chat_SlowmodeAttachmentLimitReached: String { return self._s[4258]! } + public var Stickers_GroupStickersHelp: String { return self._s[4259]! } + public var Wallet_Configuration_BlockchainIdPlaceholder: String { return self._s[4260]! } + public var Checkout_Title: String { return self._s[4261]! } + public var Activity_RecordingAudio: String { return self._s[4262]! } + public var SettingsSearch_Synonyms_Notifications_GroupNotificationsPreview: String { return self._s[4263]! } + public var BlockedUsers_BlockTitle: String { return self._s[4264]! } + public var Wallet_Month_ShortFebruary: String { return self._s[4266]! } + public var Calls_All: String { return self._s[4267]! } + public var DialogList_SavedMessagesHelp: String { return self._s[4269]! } + public var Settings_FAQ_Button: String { return self._s[4270]! } public func Time_MonthOfYear_m5(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4271]!, self._r[4271]!, [_0]) + return formatWithArgumentRanges(self._s[4272]!, self._r[4272]!, [_0]) } - public var Conversation_ReportGroupLocation: String { return self._s[4272]! } - public var Passport_Scans_Upload: String { return self._s[4273]! } - public var Channel_EditAdmin_PermissionPinMessages: String { return self._s[4275]! } - public var ChatList_UnarchiveAction: String { return self._s[4276]! } - public var Stats_GroupTopInviter_History: String { return self._s[4277]! } - public var GroupInfo_Permissions_Title: String { return self._s[4278]! } - public var Passport_Language_el: String { return self._s[4279]! } + public var Conversation_ReportGroupLocation: String { return self._s[4273]! } + public var Passport_Scans_Upload: String { return self._s[4274]! } + public var Channel_EditAdmin_PermissionPinMessages: String { return self._s[4276]! } + public var ChatList_UnarchiveAction: String { return self._s[4277]! } + public var Stats_GroupTopInviter_History: String { return self._s[4278]! } + public var GroupInfo_Permissions_Title: String { return self._s[4279]! } + public var Passport_Language_el: String { return self._s[4280]! } public func Wallet_Time_PreciseDate_m4(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4280]!, self._r[4280]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[4281]!, self._r[4281]!, [_1, _2, _3]) } - public var Channel_DiscussionMessageUnavailable: String { return self._s[4281]! } - public var GroupInfo_ActionPromote: String { return self._s[4282]! } - public var Group_OwnershipTransfer_ErrorLocatedGroupsTooMuch: String { return self._s[4283]! } + public var Channel_DiscussionMessageUnavailable: String { return self._s[4282]! } + public var GroupInfo_ActionPromote: String { return self._s[4283]! } + public var Group_OwnershipTransfer_ErrorLocatedGroupsTooMuch: String { return self._s[4284]! } public func TwoStepAuth_PendingEmailHelp(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4284]!, self._r[4284]!, [_0]) + return formatWithArgumentRanges(self._s[4285]!, self._r[4285]!, [_0]) } - public var VoiceOver_Chat_Reply: String { return self._s[4285]! } - public var Month_GenMay: String { return self._s[4286]! } - public var DialogList_DeleteBotConversationConfirmation: String { return self._s[4287]! } - public var Chat_PsaTooltip_covid: String { return self._s[4288]! } - public var Watch_Suggestion_CantTalk: String { return self._s[4289]! } - public var Privacy_GroupsAndChannels_NeverAllow_Title: String { return self._s[4290]! } - public var AppUpgrade_Running: String { return self._s[4291]! } - public var PasscodeSettings_UnlockWithFaceId: String { return self._s[4294]! } - public var Notification_Exceptions_PreviewAlwaysOff: String { return self._s[4295]! } - public var SharedMedia_EmptyText: String { return self._s[4296]! } - public var Passport_Address_EditResidentialAddress: String { return self._s[4297]! } - public var SettingsSearch_Synonyms_Notifications_GroupNotificationsAlert: String { return self._s[4298]! } - public var Message_PinnedGame: String { return self._s[4299]! } - public var KeyCommand_SearchInChat: String { return self._s[4300]! } - public var Appearance_ThemeCarouselNewNight: String { return self._s[4301]! } - public var ChatList_Search_FilterMedia: String { return self._s[4302]! } - public var Message_PinnedAudioMessage: String { return self._s[4303]! } - public var ChannelInfo_ConfirmLeave: String { return self._s[4304]! } + public var VoiceOver_Chat_Reply: String { return self._s[4286]! } + public var Month_GenMay: String { return self._s[4287]! } + public var DialogList_DeleteBotConversationConfirmation: String { return self._s[4288]! } + public var Chat_PsaTooltip_covid: String { return self._s[4289]! } + public var Watch_Suggestion_CantTalk: String { return self._s[4290]! } + public var Privacy_GroupsAndChannels_NeverAllow_Title: String { return self._s[4291]! } + public var AppUpgrade_Running: String { return self._s[4292]! } + public var PasscodeSettings_UnlockWithFaceId: String { return self._s[4295]! } + public var Notification_Exceptions_PreviewAlwaysOff: String { return self._s[4296]! } + public var SharedMedia_EmptyText: String { return self._s[4297]! } + public var Passport_Address_EditResidentialAddress: String { return self._s[4298]! } + public var SettingsSearch_Synonyms_Notifications_GroupNotificationsAlert: String { return self._s[4299]! } + public var Message_PinnedGame: String { return self._s[4300]! } + public var KeyCommand_SearchInChat: String { return self._s[4301]! } + public var Appearance_ThemeCarouselNewNight: String { return self._s[4302]! } + public var ChatList_Search_FilterMedia: String { return self._s[4303]! } + public var Message_PinnedAudioMessage: String { return self._s[4304]! } + public var ChannelInfo_ConfirmLeave: String { return self._s[4305]! } public func Channel_AdminLog_MessagePromotedNameUsername(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4305]!, self._r[4305]!, [_1, _2]) + return formatWithArgumentRanges(self._s[4306]!, self._r[4306]!, [_1, _2]) } - public var SocksProxySetup_ProxyStatusUnavailable: String { return self._s[4306]! } + public var SocksProxySetup_ProxyStatusUnavailable: String { return self._s[4307]! } public func Passport_Email_CodeHelp(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4307]!, self._r[4307]!, [_0]) + return formatWithArgumentRanges(self._s[4308]!, self._r[4308]!, [_0]) } - public var Wallet_Receive_AddressCopied: String { return self._s[4308]! } + public var Wallet_Receive_AddressCopied: String { return self._s[4309]! } public func Message_PinnedTextMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4309]!, self._r[4309]!, [_0]) + return formatWithArgumentRanges(self._s[4310]!, self._r[4310]!, [_0]) } - public var Settings_AddAccount: String { return self._s[4310]! } - public var Channel_AdminLog_CanDeleteMessages: String { return self._s[4311]! } - public var Conversation_DiscardVoiceMessageTitle: String { return self._s[4312]! } - public var Channel_JoinChannel: String { return self._s[4313]! } - public var Watch_UserInfo_Unblock: String { return self._s[4314]! } - public var PhoneLabel_Title: String { return self._s[4315]! } - public var Group_Setup_HistoryHiddenHelp: String { return self._s[4317]! } - public var Privacy_ProfilePhoto_AlwaysShareWith_Title: String { return self._s[4318]! } + public var Settings_AddAccount: String { return self._s[4311]! } + public var Channel_AdminLog_CanDeleteMessages: String { return self._s[4312]! } + public var Conversation_DiscardVoiceMessageTitle: String { return self._s[4313]! } + public var Channel_JoinChannel: String { return self._s[4314]! } + public var Watch_UserInfo_Unblock: String { return self._s[4315]! } + public var PhoneLabel_Title: String { return self._s[4316]! } + public var Group_Setup_HistoryHiddenHelp: String { return self._s[4318]! } + public var Privacy_ProfilePhoto_AlwaysShareWith_Title: String { return self._s[4319]! } public func Login_PhoneGenericEmailBody(_ _1: String, _ _2: String, _ _3: String, _ _4: String, _ _5: String, _ _6: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4319]!, self._r[4319]!, [_1, _2, _3, _4, _5, _6]) + return formatWithArgumentRanges(self._s[4320]!, self._r[4320]!, [_1, _2, _3, _4, _5, _6]) } - public var Wallet_Month_GenOctober: String { return self._s[4320]! } - public var Channel_AddBotErrorHaveRights: String { return self._s[4321]! } - public var ChatList_TabIconFoldersTooltipNonEmptyFolders: String { return self._s[4322]! } - public var DialogList_EncryptionProcessing: String { return self._s[4323]! } - public var ChatList_Search_FilterChats: String { return self._s[4324]! } - public var WatchRemote_NotificationText: String { return self._s[4325]! } - public var EditTheme_ChangeColors: String { return self._s[4326]! } - public var GroupRemoved_ViewUserInfo: String { return self._s[4327]! } - public var Wallet_TransactionInfo_RecipientHeader: String { return self._s[4328]! } - public var CallSettings_OnMobile: String { return self._s[4330]! } - public var Month_ShortFebruary: String { return self._s[4332]! } - public var VoiceOver_MessageContextReply: String { return self._s[4333]! } + public var Wallet_Month_GenOctober: String { return self._s[4321]! } + public var Channel_AddBotErrorHaveRights: String { return self._s[4322]! } + public var ChatList_TabIconFoldersTooltipNonEmptyFolders: String { return self._s[4323]! } + public var DialogList_EncryptionProcessing: String { return self._s[4324]! } + public var ChatList_Search_FilterChats: String { return self._s[4325]! } + public var WatchRemote_NotificationText: String { return self._s[4326]! } + public var EditTheme_ChangeColors: String { return self._s[4327]! } + public var GroupRemoved_ViewUserInfo: String { return self._s[4328]! } + public var Wallet_TransactionInfo_RecipientHeader: String { return self._s[4329]! } + public var CallSettings_OnMobile: String { return self._s[4331]! } + public var Month_ShortFebruary: String { return self._s[4333]! } + public var VoiceOver_MessageContextReply: String { return self._s[4334]! } public func PUSH_VIDEO_CALL_REQUEST(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4334]!, self._r[4334]!, [_1]) + return formatWithArgumentRanges(self._s[4335]!, self._r[4335]!, [_1]) } - public var Group_Location_ChangeLocation: String { return self._s[4335]! } - public var Passport_Address_TypeBankStatementUploadScan: String { return self._s[4336]! } - public var Wallet_Send_EncryptComment: String { return self._s[4337]! } - public var VoiceOver_Media_PlaybackStop: String { return self._s[4338]! } - public var SettingsSearch_Synonyms_Data_SaveIncomingPhotos: String { return self._s[4339]! } + public var Group_Location_ChangeLocation: String { return self._s[4336]! } + public var Passport_Address_TypeBankStatementUploadScan: String { return self._s[4337]! } + public var Wallet_Send_EncryptComment: String { return self._s[4338]! } + public var VoiceOver_Media_PlaybackStop: String { return self._s[4339]! } + public var SettingsSearch_Synonyms_Data_SaveIncomingPhotos: String { return self._s[4340]! } public func Channel_AdminLog_MessageRestrictedUntil(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4341]!, self._r[4341]!, [_0]) + return formatWithArgumentRanges(self._s[4342]!, self._r[4342]!, [_0]) } - public var PhotoEditor_WarmthTool: String { return self._s[4342]! } - public var Login_InfoAvatarPhoto: String { return self._s[4343]! } - public var Notification_Exceptions_NewException_MessagePreviewHeader: String { return self._s[4344]! } - public var Permissions_CellularDataAllowInSettings_v0: String { return self._s[4345]! } - public var Map_PlacesInThisArea: String { return self._s[4346]! } - public var VoiceOver_Chat_ContactEmail: String { return self._s[4347]! } - public var Notifications_InAppNotificationsSounds: String { return self._s[4348]! } + public var PhotoEditor_WarmthTool: String { return self._s[4343]! } + public var Login_InfoAvatarPhoto: String { return self._s[4344]! } + public var Notification_Exceptions_NewException_MessagePreviewHeader: String { return self._s[4345]! } + public var Permissions_CellularDataAllowInSettings_v0: String { return self._s[4346]! } + public var Map_PlacesInThisArea: String { return self._s[4347]! } + public var VoiceOver_Chat_ContactEmail: String { return self._s[4348]! } + public var Notifications_InAppNotificationsSounds: String { return self._s[4349]! } public func PUSH_PINNED_NOTEXT(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4349]!, self._r[4349]!, [_1]) + return formatWithArgumentRanges(self._s[4350]!, self._r[4350]!, [_1]) } - public var ShareMenu_Send: String { return self._s[4350]! } - public var Username_InvalidStartsWithNumber: String { return self._s[4351]! } - public var Appearance_AppIconClassicX: String { return self._s[4352]! } + public var ShareMenu_Send: String { return self._s[4351]! } + public var Username_InvalidStartsWithNumber: String { return self._s[4352]! } + public var Appearance_AppIconClassicX: String { return self._s[4353]! } public func PUSH_CHANNEL_MESSAGE_ROUND(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4353]!, self._r[4353]!, [_1]) + return formatWithArgumentRanges(self._s[4354]!, self._r[4354]!, [_1]) } - public var Conversation_StopPoll: String { return self._s[4354]! } - public var InfoPlist_NSLocationAlwaysUsageDescription: String { return self._s[4356]! } - public var Passport_Identity_EditIdentityCard: String { return self._s[4357]! } - public var Appearance_ThemePreview_ChatList_3_Name: String { return self._s[4358]! } - public var Wallet_WordCheck_Title: String { return self._s[4359]! } - public var Conversation_Timer_Title: String { return self._s[4360]! } - public var Common_Next: String { return self._s[4361]! } - public var Notification_Exceptions_NewException: String { return self._s[4362]! } + public var Conversation_StopPoll: String { return self._s[4355]! } + public var InfoPlist_NSLocationAlwaysUsageDescription: String { return self._s[4357]! } + public var Passport_Identity_EditIdentityCard: String { return self._s[4358]! } + public var Appearance_ThemePreview_ChatList_3_Name: String { return self._s[4359]! } + public var Wallet_WordCheck_Title: String { return self._s[4360]! } + public var Conversation_Timer_Title: String { return self._s[4361]! } + public var Common_Next: String { return self._s[4362]! } + public var Notification_Exceptions_NewException: String { return self._s[4363]! } public func Generic_OpenHiddenLinkAlert(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4363]!, self._r[4363]!, [_0]) + return formatWithArgumentRanges(self._s[4364]!, self._r[4364]!, [_0]) } - public var AccessDenied_CallMicrophone: String { return self._s[4364]! } - public var SettingsSearch_Synonyms_Data_AutoDownloadUsingCellular: String { return self._s[4365]! } - public var ChangePhoneNumberCode_Help: String { return self._s[4366]! } - public var Passport_Identity_OneOfTypeIdentityCard: String { return self._s[4367]! } - public var Channel_AdminLogFilter_EventsLeaving: String { return self._s[4368]! } - public var BlockedUsers_LeavePrefix: String { return self._s[4369]! } + public var AccessDenied_CallMicrophone: String { return self._s[4365]! } + public var SettingsSearch_Synonyms_Data_AutoDownloadUsingCellular: String { return self._s[4366]! } + public var ChangePhoneNumberCode_Help: String { return self._s[4367]! } + public var Passport_Identity_OneOfTypeIdentityCard: String { return self._s[4368]! } + public var Channel_AdminLogFilter_EventsLeaving: String { return self._s[4369]! } + public var BlockedUsers_LeavePrefix: String { return self._s[4370]! } public func Passport_RequestHeader(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4370]!, self._r[4370]!, [_0]) + return formatWithArgumentRanges(self._s[4371]!, self._r[4371]!, [_0]) } - public var Group_About_Help: String { return self._s[4371]! } - public var TwoStepAuth_ChangePasswordDescription: String { return self._s[4372]! } - public var Tour_Title3: String { return self._s[4373]! } - public var Watch_Conversation_Unblock: String { return self._s[4374]! } - public var Watch_UserInfo_Block: String { return self._s[4375]! } - public var Notifications_ChannelNotificationsAlert: String { return self._s[4376]! } - public var TwoFactorSetup_Hint_Action: String { return self._s[4377]! } - public var IntentsSettings_SuggestedChatsInfo: String { return self._s[4378]! } - public var Wallet_Alert_Cancel: String { return self._s[4379]! } - public var TextFormat_AddLinkTitle: String { return self._s[4380]! } - public var GroupInfo_InviteLink_RevokeAlert_Revoke: String { return self._s[4381]! } - public var TwoStepAuth_EnterPasswordTitle: String { return self._s[4382]! } - public var FastTwoStepSetup_PasswordSection: String { return self._s[4383]! } - public var Compose_ChannelMembers: String { return self._s[4384]! } - public var Conversation_ForwardTitle: String { return self._s[4385]! } + public var Group_About_Help: String { return self._s[4372]! } + public var TwoStepAuth_ChangePasswordDescription: String { return self._s[4373]! } + public var Tour_Title3: String { return self._s[4374]! } + public var Watch_Conversation_Unblock: String { return self._s[4375]! } + public var Watch_UserInfo_Block: String { return self._s[4376]! } + public var Notifications_ChannelNotificationsAlert: String { return self._s[4377]! } + public var TwoFactorSetup_Hint_Action: String { return self._s[4378]! } + public var IntentsSettings_SuggestedChatsInfo: String { return self._s[4379]! } + public var Wallet_Alert_Cancel: String { return self._s[4380]! } + public var TextFormat_AddLinkTitle: String { return self._s[4381]! } + public var GroupInfo_InviteLink_RevokeAlert_Revoke: String { return self._s[4382]! } + public var TwoStepAuth_EnterPasswordTitle: String { return self._s[4383]! } + public var FastTwoStepSetup_PasswordSection: String { return self._s[4384]! } + public var Compose_ChannelMembers: String { return self._s[4385]! } + public var Conversation_ForwardTitle: String { return self._s[4386]! } public func Wallet_Updated_AtDate(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4386]!, self._r[4386]!, [_0]) + return formatWithArgumentRanges(self._s[4387]!, self._r[4387]!, [_0]) } - public var Conversation_PinnedPoll: String { return self._s[4388]! } + public var Conversation_PinnedPoll: String { return self._s[4389]! } public func VoiceOver_Chat_AnonymousPollFrom(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4389]!, self._r[4389]!, [_0]) + return formatWithArgumentRanges(self._s[4390]!, self._r[4390]!, [_0]) } - public var SettingsSearch_Synonyms_EditProfile_AddAccount: String { return self._s[4390]! } - public var Conversation_ContextMenuStickerPackAdd: String { return self._s[4391]! } - public var Stats_Overview: String { return self._s[4392]! } - public var Map_HomeAndWorkTitle: String { return self._s[4393]! } - public var Wallet_Intro_Terms: String { return self._s[4394]! } + public var SettingsSearch_Synonyms_EditProfile_AddAccount: String { return self._s[4391]! } + public var Conversation_ContextMenuStickerPackAdd: String { return self._s[4392]! } + public var Stats_Overview: String { return self._s[4393]! } + public var Map_HomeAndWorkTitle: String { return self._s[4394]! } + public var Wallet_Intro_Terms: String { return self._s[4395]! } public func Time_PreciseDate_m4(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4395]!, self._r[4395]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[4396]!, self._r[4396]!, [_1, _2, _3]) } - public var Passport_Address_CityPlaceholder: String { return self._s[4396]! } - public var InfoPlist_NSLocationAlwaysAndWhenInUseUsageDescription: String { return self._s[4397]! } - public var Privacy_PhoneNumber: String { return self._s[4398]! } - public var ChatList_Search_FilterFiles: String { return self._s[4399]! } - public var ChatList_DeleteForEveryoneConfirmationAction: String { return self._s[4400]! } - public var ChannelIntro_CreateChannel: String { return self._s[4401]! } - public var Conversation_InputTextAnonymousPlaceholder: String { return self._s[4402]! } + public var Passport_Address_CityPlaceholder: String { return self._s[4397]! } + public var InfoPlist_NSLocationAlwaysAndWhenInUseUsageDescription: String { return self._s[4398]! } + public var Privacy_PhoneNumber: String { return self._s[4399]! } + public var ChatList_Search_FilterFiles: String { return self._s[4400]! } + public var ChatList_DeleteForEveryoneConfirmationAction: String { return self._s[4401]! } + public var ChannelIntro_CreateChannel: String { return self._s[4402]! } + public var Conversation_InputTextAnonymousPlaceholder: String { return self._s[4403]! } public func Login_EmailCodeBody(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4403]!, self._r[4403]!, [_0]) + return formatWithArgumentRanges(self._s[4404]!, self._r[4404]!, [_0]) } - public var Weekday_ShortMonday: String { return self._s[4404]! } - public var Passport_Language_ar: String { return self._s[4406]! } - public var SettingsSearch_Synonyms_EditProfile_Title: String { return self._s[4407]! } - public var TwoFactorSetup_Done_Title: String { return self._s[4408]! } - public var Calls_RatingFeedback: String { return self._s[4409]! } - public var SettingsSearch_Synonyms_Notifications_ChannelNotificationsPreview: String { return self._s[4410]! } - public var AutoDownloadSettings_ResetSettings: String { return self._s[4413]! } - public var Watch_Compose_Send: String { return self._s[4414]! } - public var PasscodeSettings_ChangePasscode: String { return self._s[4415]! } - public var WebSearch_RecentSectionClear: String { return self._s[4416]! } + public var Weekday_ShortMonday: String { return self._s[4405]! } + public var Passport_Language_ar: String { return self._s[4407]! } + public var SettingsSearch_Synonyms_EditProfile_Title: String { return self._s[4408]! } + public var TwoFactorSetup_Done_Title: String { return self._s[4409]! } + public var Calls_RatingFeedback: String { return self._s[4410]! } + public var SettingsSearch_Synonyms_Notifications_ChannelNotificationsPreview: String { return self._s[4411]! } + public var AutoDownloadSettings_ResetSettings: String { return self._s[4414]! } + public var Watch_Compose_Send: String { return self._s[4415]! } + public var PasscodeSettings_ChangePasscode: String { return self._s[4416]! } + public var WebSearch_RecentSectionClear: String { return self._s[4417]! } public func Contacts_AccessDeniedHelpPortrait(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4417]!, self._r[4417]!, [_0]) + return formatWithArgumentRanges(self._s[4418]!, self._r[4418]!, [_0]) } - public var WallpaperSearch_ColorTeal: String { return self._s[4418]! } - public var Wallpaper_SetCustomBackgroundInfo: String { return self._s[4419]! } - public var Permissions_ContactsTitle_v0: String { return self._s[4420]! } - public var Checkout_PasswordEntry_Pay: String { return self._s[4422]! } - public var Settings_SavedMessages: String { return self._s[4423]! } - public var TwoStepAuth_ReEnterPasswordDescription: String { return self._s[4424]! } - public var Month_ShortMarch: String { return self._s[4425]! } - public var Message_Location: String { return self._s[4426]! } + public var WallpaperSearch_ColorTeal: String { return self._s[4419]! } + public var Wallpaper_SetCustomBackgroundInfo: String { return self._s[4420]! } + public var Permissions_ContactsTitle_v0: String { return self._s[4421]! } + public var Checkout_PasswordEntry_Pay: String { return self._s[4423]! } + public var Settings_SavedMessages: String { return self._s[4424]! } + public var TwoStepAuth_ReEnterPasswordDescription: String { return self._s[4425]! } + public var Month_ShortMarch: String { return self._s[4426]! } + public var Message_Location: String { return self._s[4427]! } public func PUSH_MESSAGE_GIF(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4427]!, self._r[4427]!, [_1]) + return formatWithArgumentRanges(self._s[4428]!, self._r[4428]!, [_1]) } public func Notification_CallTimeFormat(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4428]!, self._r[4428]!, [_1, _2]) + return formatWithArgumentRanges(self._s[4429]!, self._r[4429]!, [_1, _2]) } - public var VoiceOver_Chat_VoiceMessage: String { return self._s[4430]! } + public var VoiceOver_Chat_VoiceMessage: String { return self._s[4431]! } public func Channel_AdminLog_MessageChangedUnlinkedChannel(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4431]!, self._r[4431]!, [_1, _2]) + return formatWithArgumentRanges(self._s[4432]!, self._r[4432]!, [_1, _2]) } - public var GroupPermission_NoSendMedia: String { return self._s[4432]! } - public var Conversation_ClousStorageInfo_Description2: String { return self._s[4433]! } - public var SharedMedia_CategoryDocs: String { return self._s[4434]! } - public var Appearance_RemoveThemeConfirmation: String { return self._s[4435]! } - public var Paint_Framed: String { return self._s[4436]! } - public var Channel_EditAdmin_PermissionAddAdmins: String { return self._s[4437]! } - public var Passport_Identity_DoesNotExpire: String { return self._s[4438]! } - public var Channel_SignMessages: String { return self._s[4439]! } - public var Contacts_AccessDeniedHelpON: String { return self._s[4440]! } - public var Conversation_ContextMenuStickerPackInfo: String { return self._s[4441]! } + public var GroupPermission_NoSendMedia: String { return self._s[4433]! } + public var Conversation_ClousStorageInfo_Description2: String { return self._s[4434]! } + public var SharedMedia_CategoryDocs: String { return self._s[4435]! } + public var Appearance_RemoveThemeConfirmation: String { return self._s[4436]! } + public var Paint_Framed: String { return self._s[4437]! } + public var Channel_EditAdmin_PermissionAddAdmins: String { return self._s[4438]! } + public var Passport_Identity_DoesNotExpire: String { return self._s[4439]! } + public var Channel_SignMessages: String { return self._s[4440]! } + public var Contacts_AccessDeniedHelpON: String { return self._s[4441]! } + public var Conversation_ContextMenuStickerPackInfo: String { return self._s[4442]! } public func PUSH_CHAT_LEFT(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4442]!, self._r[4442]!, [_1, _2]) + return formatWithArgumentRanges(self._s[4443]!, self._r[4443]!, [_1, _2]) } - public var GroupInfo_UpgradeButton: String { return self._s[4443]! } - public var Channel_EditAdmin_PermissionInviteMembers: String { return self._s[4444]! } - public var AutoDownloadSettings_Files: String { return self._s[4445]! } + public var GroupInfo_UpgradeButton: String { return self._s[4444]! } + public var Channel_EditAdmin_PermissionInviteMembers: String { return self._s[4445]! } + public var AutoDownloadSettings_Files: String { return self._s[4446]! } public func Notification_ChangedGroupName(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4446]!, self._r[4446]!, [_0, _1]) + return formatWithArgumentRanges(self._s[4447]!, self._r[4447]!, [_0, _1]) } - public var Login_SendCodeViaSms: String { return self._s[4448]! } - public var Update_UpdateApp: String { return self._s[4449]! } - public var Channel_Setup_TypePublic: String { return self._s[4450]! } - public var Watch_Compose_CreateMessage: String { return self._s[4451]! } + public var Login_SendCodeViaSms: String { return self._s[4449]! } + public var Update_UpdateApp: String { return self._s[4450]! } + public var Channel_Setup_TypePublic: String { return self._s[4451]! } + public var Watch_Compose_CreateMessage: String { return self._s[4452]! } public func PUSH_CHAT_MESSAGE_VIDEOS(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4452]!, self._r[4452]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[4453]!, self._r[4453]!, [_1, _2, _3]) } - public var StickerPacksSettings_ManagingHelp: String { return self._s[4453]! } + public var StickerPacksSettings_ManagingHelp: String { return self._s[4454]! } public func Wallet_Time_PreciseDate_m12(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4454]!, self._r[4454]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[4455]!, self._r[4455]!, [_1, _2, _3]) } - public var VoiceOver_Chat_Video: String { return self._s[4455]! } - public var Forward_ChannelReadOnly: String { return self._s[4456]! } - public var StickerPack_HideStickers: String { return self._s[4457]! } - public var ChatListFolder_NameContacts: String { return self._s[4458]! } - public var Profile_BotInfo: String { return self._s[4459]! } - public var Document_TargetConfirmationFormat: String { return self._s[4460]! } - public var GroupInfo_InviteByLink: String { return self._s[4461]! } - public var Channel_AdminLog_BanSendStickersAndGifs: String { return self._s[4462]! } - public var Watch_Stickers_RecentPlaceholder: String { return self._s[4463]! } - public var Broadcast_AdminLog_EmptyText: String { return self._s[4464]! } - public var Passport_NotLoggedInMessage: String { return self._s[4465]! } - public var Conversation_StopQuizConfirmation: String { return self._s[4466]! } - public var Checkout_PaymentMethod: String { return self._s[4467]! } - public var ChatList_ArchivedChatsTitle: String { return self._s[4471]! } - public var TwoStepAuth_SetupPasswordConfirmFailed: String { return self._s[4472]! } - public var VoiceOver_Chat_RecordPreviewVoiceMessage: String { return self._s[4473]! } - public var PrivacyLastSeenSettings_GroupsAndChannelsHelp: String { return self._s[4474]! } - public var SettingsSearch_Synonyms_Privacy_Data_ContactsReset: String { return self._s[4475]! } - public var Camera_Title: String { return self._s[4476]! } - public var Map_Directions: String { return self._s[4477]! } - public var Wallet_Intro_ImportExisting: String { return self._s[4478]! } - public var Stats_MessagePublicForwardsTitle: String { return self._s[4479]! } - public var Privacy_ProfilePhoto_WhoCanSeeMyPhoto: String { return self._s[4481]! } - public var Profile_EncryptionKey: String { return self._s[4482]! } + public var VoiceOver_Chat_Video: String { return self._s[4456]! } + public var Forward_ChannelReadOnly: String { return self._s[4457]! } + public var StickerPack_HideStickers: String { return self._s[4458]! } + public var ChatListFolder_NameContacts: String { return self._s[4459]! } + public var Profile_BotInfo: String { return self._s[4460]! } + public var Document_TargetConfirmationFormat: String { return self._s[4461]! } + public var GroupInfo_InviteByLink: String { return self._s[4462]! } + public var Channel_AdminLog_BanSendStickersAndGifs: String { return self._s[4463]! } + public var Watch_Stickers_RecentPlaceholder: String { return self._s[4464]! } + public var Broadcast_AdminLog_EmptyText: String { return self._s[4465]! } + public var Passport_NotLoggedInMessage: String { return self._s[4466]! } + public var Conversation_StopQuizConfirmation: String { return self._s[4467]! } + public var Checkout_PaymentMethod: String { return self._s[4468]! } + public var ChatList_ArchivedChatsTitle: String { return self._s[4472]! } + public var TwoStepAuth_SetupPasswordConfirmFailed: String { return self._s[4473]! } + public var VoiceOver_Chat_RecordPreviewVoiceMessage: String { return self._s[4474]! } + public var PrivacyLastSeenSettings_GroupsAndChannelsHelp: String { return self._s[4475]! } + public var SettingsSearch_Synonyms_Privacy_Data_ContactsReset: String { return self._s[4476]! } + public var Camera_Title: String { return self._s[4477]! } + public var Map_Directions: String { return self._s[4478]! } + public var Wallet_Intro_ImportExisting: String { return self._s[4479]! } + public var Stats_MessagePublicForwardsTitle: String { return self._s[4480]! } + public var Privacy_ProfilePhoto_WhoCanSeeMyPhoto: String { return self._s[4482]! } + public var Profile_EncryptionKey: String { return self._s[4483]! } public func LOCAL_CHAT_MESSAGE_FWDS(_ _1: String, _ _2: Int) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4483]!, self._r[4483]!, [_1, "\(_2)"]) + return formatWithArgumentRanges(self._s[4484]!, self._r[4484]!, [_1, "\(_2)"]) } public func Compatibility_SecretMediaVersionTooLow(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4484]!, self._r[4484]!, [_0, _1]) + return formatWithArgumentRanges(self._s[4485]!, self._r[4485]!, [_0, _1]) } - public var Passport_Identity_TypePassport: String { return self._s[4485]! } - public var CreatePoll_QuizOptionsHeader: String { return self._s[4487]! } - public var Common_No: String { return self._s[4488]! } - public var Conversation_SendMessage_ScheduleMessage: String { return self._s[4489]! } - public var SettingsSearch_Synonyms_Privacy_LastSeen: String { return self._s[4490]! } - public var Settings_AboutEmpty: String { return self._s[4491]! } - public var TwoStepAuth_FloodError: String { return self._s[4493]! } - public var SettingsSearch_Synonyms_Appearance_TextSize: String { return self._s[4494]! } + public var Passport_Identity_TypePassport: String { return self._s[4486]! } + public var CreatePoll_QuizOptionsHeader: String { return self._s[4488]! } + public var Common_No: String { return self._s[4489]! } + public var Conversation_SendMessage_ScheduleMessage: String { return self._s[4490]! } + public var SettingsSearch_Synonyms_Privacy_LastSeen: String { return self._s[4491]! } + public var Settings_AboutEmpty: String { return self._s[4492]! } + public var TwoStepAuth_FloodError: String { return self._s[4494]! } + public var SettingsSearch_Synonyms_Appearance_TextSize: String { return self._s[4495]! } public func Channel_AdminLog_MessageUnkickedName(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4496]!, self._r[4496]!, [_1]) + return formatWithArgumentRanges(self._s[4497]!, self._r[4497]!, [_1]) } - public var Conversation_Edit: String { return self._s[4499]! } - public var CheckoutInfo_SaveInfo: String { return self._s[4500]! } - public var VoiceOver_Chat_AnonymousPoll: String { return self._s[4501]! } - public var Call_CameraTooltip: String { return self._s[4503]! } - public var InstantPage_FeedbackButtonShort: String { return self._s[4504]! } - public var Contacts_InviteToTelegram: String { return self._s[4505]! } - public var Wallet_WordImport_CanNotRemember: String { return self._s[4506]! } - public var Notifications_ResetAllNotifications: String { return self._s[4507]! } - public var Calls_NewCall: String { return self._s[4508]! } - public var VoiceOver_Chat_Music: String { return self._s[4511]! } - public var Channel_Members_AddAdminErrorNotAMember: String { return self._s[4512]! } - public var Channel_Edit_AboutItem: String { return self._s[4513]! } - public var Message_VideoExpired: String { return self._s[4514]! } - public var Passport_Address_TypeTemporaryRegistrationUploadScan: String { return self._s[4515]! } + public var Conversation_Edit: String { return self._s[4500]! } + public var CheckoutInfo_SaveInfo: String { return self._s[4501]! } + public var VoiceOver_Chat_AnonymousPoll: String { return self._s[4502]! } + public var Call_CameraTooltip: String { return self._s[4504]! } + public var InstantPage_FeedbackButtonShort: String { return self._s[4505]! } + public var Contacts_InviteToTelegram: String { return self._s[4506]! } + public var Wallet_WordImport_CanNotRemember: String { return self._s[4507]! } + public var Notifications_ResetAllNotifications: String { return self._s[4508]! } + public var Calls_NewCall: String { return self._s[4509]! } + public var VoiceOver_Chat_Music: String { return self._s[4512]! } + public var Channel_Members_AddAdminErrorNotAMember: String { return self._s[4513]! } + public var Channel_Edit_AboutItem: String { return self._s[4514]! } + public var Message_VideoExpired: String { return self._s[4515]! } + public var Passport_Address_TypeTemporaryRegistrationUploadScan: String { return self._s[4516]! } public func PUSH_CHAT_RETURNED(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4516]!, self._r[4516]!, [_1, _2]) + return formatWithArgumentRanges(self._s[4517]!, self._r[4517]!, [_1, _2]) } - public var NotificationsSound_Input: String { return self._s[4518]! } - public var Notifications_ClassicTones: String { return self._s[4519]! } - public var Conversation_StatusTyping: String { return self._s[4520]! } - public var Checkout_ErrorProviderAccountInvalid: String { return self._s[4521]! } - public var ChatSettings_AutoDownloadSettings_Delimeter: String { return self._s[4522]! } - public var Wallet_Month_ShortSeptember: String { return self._s[4523]! } - public var SettingsSearch_Synonyms_Notifications_BadgeIncludeMutedChats: String { return self._s[4524]! } - public var Conversation_MessageLeaveComment: String { return self._s[4525]! } - public var UserInfo_TapToCall: String { return self._s[4526]! } - public var EnterPasscode_EnterNewPasscodeNew: String { return self._s[4527]! } - public var Conversation_ClearAll: String { return self._s[4529]! } - public var UserInfo_NotificationsDefault: String { return self._s[4530]! } - public var Wallet_Send_OwnAddressAlertText: String { return self._s[4531]! } - public var Map_ChooseAPlace: String { return self._s[4532]! } + public var NotificationsSound_Input: String { return self._s[4519]! } + public var Notifications_ClassicTones: String { return self._s[4520]! } + public var Conversation_StatusTyping: String { return self._s[4521]! } + public var Checkout_ErrorProviderAccountInvalid: String { return self._s[4522]! } + public var ChatSettings_AutoDownloadSettings_Delimeter: String { return self._s[4523]! } + public var Wallet_Month_ShortSeptember: String { return self._s[4524]! } + public var SettingsSearch_Synonyms_Notifications_BadgeIncludeMutedChats: String { return self._s[4525]! } + public var Conversation_MessageLeaveComment: String { return self._s[4526]! } + public var UserInfo_TapToCall: String { return self._s[4527]! } + public var EnterPasscode_EnterNewPasscodeNew: String { return self._s[4528]! } + public var Conversation_ClearAll: String { return self._s[4530]! } + public var UserInfo_NotificationsDefault: String { return self._s[4531]! } + public var Wallet_Send_OwnAddressAlertText: String { return self._s[4532]! } + public var Map_ChooseAPlace: String { return self._s[4533]! } public func Wallet_Receive_ShareInvoiceUrlInfo(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4533]!, self._r[4533]!, [_0]) + return formatWithArgumentRanges(self._s[4534]!, self._r[4534]!, [_0]) } - public var GroupInfo_AddParticipantTitle: String { return self._s[4534]! } - public var ChatList_PeerTypeNonContact: String { return self._s[4535]! } - public var Conversation_SlideToCancel: String { return self._s[4536]! } - public var Month_ShortJuly: String { return self._s[4537]! } - public var SocksProxySetup_ProxyType: String { return self._s[4538]! } + public var GroupInfo_AddParticipantTitle: String { return self._s[4535]! } + public var ChatList_PeerTypeNonContact: String { return self._s[4536]! } + public var Conversation_SlideToCancel: String { return self._s[4537]! } + public var Month_ShortJuly: String { return self._s[4538]! } + public var SocksProxySetup_ProxyType: String { return self._s[4539]! } public func ChatList_DeleteChatConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4539]!, self._r[4539]!, [_0]) + return formatWithArgumentRanges(self._s[4540]!, self._r[4540]!, [_0]) } - public var ChatList_EditFolders: String { return self._s[4540]! } - public var TwoStepAuth_SetPasswordHelp: String { return self._s[4541]! } - public var Wallet_Send_ConfirmationConfirm: String { return self._s[4543]! } - public var Wallet_Created_ExportErrorTitle: String { return self._s[4544]! } + public var ChatList_EditFolders: String { return self._s[4541]! } + public var TwoStepAuth_SetPasswordHelp: String { return self._s[4542]! } + public var Wallet_Send_ConfirmationConfirm: String { return self._s[4544]! } + public var Wallet_Created_ExportErrorTitle: String { return self._s[4545]! } public func GroupPermission_ApplyAlertText(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4545]!, self._r[4545]!, [_0]) + return formatWithArgumentRanges(self._s[4546]!, self._r[4546]!, [_0]) } - public var Permissions_PeopleNearbyTitle_v0: String { return self._s[4546]! } - public var ScheduledMessages_RemindersTitle: String { return self._s[4547]! } - public var Your_cards_expiration_year_is_invalid: String { return self._s[4548]! } - public var Wallet_Info_TransactionPendingHeader: String { return self._s[4550]! } - public var UserInfo_ShareMyContactInfo: String { return self._s[4551]! } - public var Passport_DeleteAddress: String { return self._s[4553]! } - public var Passport_DeletePassportConfirmation: String { return self._s[4554]! } - public var Passport_Identity_ReverseSide: String { return self._s[4555]! } - public var CheckoutInfo_ErrorEmailInvalid: String { return self._s[4556]! } - public var Login_InfoLastNamePlaceholder: String { return self._s[4557]! } - public var Passport_FieldAddress: String { return self._s[4558]! } - public var SettingsSearch_Synonyms_Calls_Title: String { return self._s[4559]! } - public var Passport_Identity_ResidenceCountryPlaceholder: String { return self._s[4561]! } - public var Map_Home: String { return self._s[4563]! } - public var PollResults_Title: String { return self._s[4564]! } - public var ArchivedChats_IntroText2: String { return self._s[4566]! } - public var PasscodeSettings_SimplePasscodeHelp: String { return self._s[4567]! } - public var VoiceOver_Chat_ContactPhoneNumber: String { return self._s[4568]! } - public var CallFeedback_ReasonSilentRemote: String { return self._s[4570]! } - public var Passport_Identity_AddPersonalDetails: String { return self._s[4572]! } - public var Group_Info_AdminLog: String { return self._s[4574]! } - public var ChatSettings_AutoPlayTitle: String { return self._s[4575]! } - public var Appearance_Animations: String { return self._s[4576]! } - public var Appearance_TextSizeSetting: String { return self._s[4577]! } - public func ForwardedPhotos(_ value: Int32) -> String { + public var Permissions_PeopleNearbyTitle_v0: String { return self._s[4547]! } + public var ScheduledMessages_RemindersTitle: String { return self._s[4548]! } + public var Your_cards_expiration_year_is_invalid: String { return self._s[4549]! } + public var Wallet_Info_TransactionPendingHeader: String { return self._s[4551]! } + public var UserInfo_ShareMyContactInfo: String { return self._s[4552]! } + public var Passport_DeleteAddress: String { return self._s[4554]! } + public var Passport_DeletePassportConfirmation: String { return self._s[4555]! } + public var Passport_Identity_ReverseSide: String { return self._s[4556]! } + public var CheckoutInfo_ErrorEmailInvalid: String { return self._s[4557]! } + public var Login_InfoLastNamePlaceholder: String { return self._s[4558]! } + public var Passport_FieldAddress: String { return self._s[4559]! } + public var SettingsSearch_Synonyms_Calls_Title: String { return self._s[4560]! } + public var Passport_Identity_ResidenceCountryPlaceholder: String { return self._s[4562]! } + public var Map_Home: String { return self._s[4564]! } + public var PollResults_Title: String { return self._s[4565]! } + public var ArchivedChats_IntroText2: String { return self._s[4567]! } + public var PasscodeSettings_SimplePasscodeHelp: String { return self._s[4568]! } + public var VoiceOver_Chat_ContactPhoneNumber: String { return self._s[4569]! } + public var CallFeedback_ReasonSilentRemote: String { return self._s[4571]! } + public var Passport_Identity_AddPersonalDetails: String { return self._s[4573]! } + public var Group_Info_AdminLog: String { return self._s[4575]! } + public var ChatSettings_AutoPlayTitle: String { return self._s[4576]! } + public var Appearance_Animations: String { return self._s[4577]! } + public var Appearance_TextSizeSetting: String { return self._s[4578]! } + public func ServiceMessage_GameScoreExtended(_ 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 SharedMedia_Video(_ 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[1 * 6 + Int(form.rawValue)]!, stringValue) } - public func Stats_GroupTopAdminDeletions(_ value: Int32) -> String { + public func StickerPack_RemoveMaskCount(_ 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 CreatePoll_AddMoreOptions(_ 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 Conversation_TitleReplies(_ 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 Map_ETAMinutes(_ 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 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 Call_ShortMinutes(_ 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 Stats_GroupShowMoreTopPosters(_ 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 ChatList_MessageVideos(_ 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 Stats_GroupShowMoreTopAdmins(_ 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 OldChannels_InactiveYear(_ 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 Map_ETAHours(_ 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 Stats_MessageViews(_ 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 ChatList_DeleteConfirmation(_ 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 Conversation_MessageViewComments(_ 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 Call_ShortSeconds(_ 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 OldChannels_GroupFormat(_ 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 Contacts_InviteContacts(_ 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 Watch_LastSeen_MinutesAgo(_ 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 OldChannels_InactiveMonth(_ 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 MessageTimer_ShortSeconds(_ 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 ForwardedGifs(_ 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 MessageTimer_Hours(_ 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 Notification_GameScoreExtended(_ 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 PUSH_CHANNEL_MESSAGES(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[25 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func SharedMedia_Link(_ 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 Stats_GroupTopPosterMessages(_ 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 ForwardedAudios(_ 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 GroupInfo_ParticipantCount(_ 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 PUSH_MESSAGES(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[30 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func ForwardedVideos(_ 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 Conversation_StatusSubscribers(_ 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 Media_ShareVideo(_ 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 LiveLocation_MenuChatsCount(_ 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 Stats_GroupTopAdminKicks(_ 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 Forward_ConfirmMultipleFiles(_ 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 StickerPack_AddStickerCount(_ 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 VoiceOver_Chat_ContactPhoneNumberCount(_ 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 PollResults_ShowMore(_ 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 MuteExpires_Minutes(_ 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 ServiceMessage_GameScoreSelfExtended(_ 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 SharedMedia_Photo(_ 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 Media_SharePhoto(_ 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 Stats_MessageForwards(_ 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 Chat_DeleteMessagesConfirmation(_ 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 AttachmentMenu_SendGif(_ 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 Stats_GroupShowMoreTopInviters(_ 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 ForwardedAuthorsOthers(_ selector: Int32, _ _0: String, _ _1: String) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[48 * 6 + Int(form.rawValue)]!, _0, _1) - } - public func Media_ShareItem(_ 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 ForwardedStickers(_ 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 ChatList_Search_Messages(_ 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 Watch_UserInfo_Mute(_ 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 Contacts_ImportersCount(_ 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 Conversation_SelectedMessages(_ 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 GroupInfo_ShowMoreMembers(_ 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 Notifications_Exceptions(_ 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 MessageTimer_Days(_ 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 AttachmentMenu_SendVideo(_ 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 MuteExpires_Days(_ 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 Conversation_LiveLocationMembersCount(_ 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 ChatList_MessagePhotos(_ 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 OldChannels_Leave(_ 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) - } - public func SharedMedia_File(_ 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) - } - public func Theme_UsersCount(_ 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 PUSH_MESSAGE_FWDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[65 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func ForwardedVideoMessages(_ 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 PUSH_CHANNEL_MESSAGE_ROUNDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[67 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func PUSH_CHANNEL_MESSAGE_VIDEOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[68 * 6 + Int(form.rawValue)]!, _1, _2) - } - 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[69 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ForwardedLocations(_ 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 MessageTimer_Seconds(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[71 * 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[72 * 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[73 * 6 + Int(form.rawValue)]!, _2, _1, _3) - } - public func Passport_Scans(_ 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 Wallpaper_DeleteConfirmation(_ 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 LiveLocationUpdated_MinutesAgo(_ 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 PUSH_CHAT_MESSAGE_PHOTOS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[77 * 6 + Int(form.rawValue)]!, _2, _1, _3) - } - public func PUSH_MESSAGE_PHOTOS(_ 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 MessageTimer_ShortWeeks(_ 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 Call_Minutes(_ 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 Stats_GroupTopAdminBans(_ 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 ForwardedContacts(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[82 * 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[83 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ServiceMessage_GameScoreSelfSimple(_ 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) - } - public func Conversation_TitleComments(_ 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 ChatList_SelectedChats(_ 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 PrivacyLastSeenSettings_AddUsers(_ 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 Notification_GameScoreSelfExtended(_ 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 SharedMedia_DeleteItemsConfirmation(_ 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 StickerPack_StickerCount(_ 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 Notifications_ExceptionMuteExpires_Minutes(_ 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 SharedMedia_Generic(_ 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 Wallet_Updated_MinutesAgo(_ 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 PUSH_CHANNEL_MESSAGE_FWDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[94 * 6 + Int(form.rawValue)]!, _1, _2) - } - 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[95 * 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[96 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func StickerPack_RemoveStickerCount(_ 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_ShortMinutes(_ 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) + return String(format: self._ps[3 * 6 + Int(form.rawValue)]!, _1, _2) } public func Stats_GroupTopInviterInvites(_ 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) + return String(format: self._ps[4 * 6 + Int(form.rawValue)]!, stringValue) } - public func Conversation_StatusMembers(_ value: Int32) -> String { + public func MessageTimer_Hours(_ 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) + return String(format: self._ps[5 * 6 + Int(form.rawValue)]!, stringValue) } - public func StickerPack_AddMaskCount(_ value: Int32) -> String { + public func Call_Minutes(_ 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) + return String(format: self._ps[6 * 6 + Int(form.rawValue)]!, stringValue) } - public func MuteFor_Days(_ value: Int32) -> String { + public func ChatList_MessageVideos(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[102 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[7 * 6 + Int(form.rawValue)]!, stringValue) } - public func LastSeen_HoursAgo(_ value: Int32) -> String { + public func MessageTimer_ShortSeconds(_ 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 Notifications_ExceptionMuteExpires_Days(_ 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 MessagePoll_VotedCount(_ 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 MuteExpires_Hours(_ 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 ServiceMessage_GameScoreExtended(_ 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 Notification_GameScoreSelfSimple(_ 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 Notification_GameScoreSimple(_ 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 AttachmentMenu_SendPhoto(_ 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 MessageTimer_Weeks(_ 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) - } - public func ServiceMessage_GameScoreSimple(_ 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 AttachmentMenu_SendItem(_ 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 QuickSend_Photos(_ 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 ForwardedPolls(_ 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) - } - public func Invitation_Members(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[116 * 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[117 * 6 + Int(form.rawValue)]!, _2, _1, _3) - } - public func MessageTimer_Months(_ 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 PasscodeSettings_FailedAttempts(_ 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 Conversation_ContextViewReplies(_ 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 VoiceOver_Chat_PollOptionCount(_ 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 ChatListFilter_ShowMoreChats(_ 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 LastSeen_MinutesAgo(_ 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 Notifications_ExceptionMuteExpires_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 ChatList_DeletedChats(_ 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 PUSH_CHAT_MESSAGE_ROUNDS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[126 * 6 + Int(form.rawValue)]!, _2, _1, _3) - } - public func MessageTimer_Minutes(_ 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 InstantPage_Views(_ 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 VoiceOver_Chat_ContactEmailCount(_ 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 PUSH_CHAT_MESSAGE_FWDS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[130 * 6 + Int(form.rawValue)]!, _2, _1, _3) - } - public func DialogList_LiveLocationChatsCount(_ 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) - } - public func UserCount(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[132 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_MESSAGE_VIDEOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[133 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func OldChannels_InactiveWeek(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[134 * 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[135 * 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[136 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Stats_GroupTopPosterChars(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[137 * 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[138 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_MESSAGE_ROUNDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[139 * 6 + Int(form.rawValue)]!, _1, _2) + return String(format: self._ps[8 * 6 + Int(form.rawValue)]!, stringValue) } public func ForwardedFiles(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[140 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[9 * 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[10 * 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[11 * 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[12 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Stats_GroupTopPosterMessages(_ 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 Media_ShareVideo(_ 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 MessagePoll_VotedCount(_ 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 AttachmentMenu_SendVideo(_ 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 MuteExpires_Minutes(_ 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 SharedMedia_Link(_ 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 Stats_GroupShowMoreTopInviters(_ 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 StickerPack_AddStickerCount(_ 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 PUSH_CHAT_MESSAGE_PHOTOS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[21 * 6 + Int(form.rawValue)]!, _2, _1, _3) + } + 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[22 * 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[23 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Invitation_Members(_ 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 MessagePoll_QuizCount(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[141 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[25 * 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[26 * 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[27 * 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[28 * 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[29 * 6 + Int(form.rawValue)]!, _2, _1, _3) + } + 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[30 * 6 + Int(form.rawValue)]!, _2, _1, _3) + } + public func Stats_MessageForwards(_ 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 Watch_UserInfo_Mute(_ 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 PUSH_MESSAGE_VIDEOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[33 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func MessageTimer_Years(_ 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 Call_ShortMinutes(_ 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 OldChannels_Leave(_ 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 ServiceMessage_GameScoreSelfSimple(_ 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 Notifications_Exceptions(_ 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 AttachmentMenu_SendItem(_ 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 Call_ShortSeconds(_ 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 Map_ETAHours(_ 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 MessageTimer_Weeks(_ 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 ChatList_DeletedChats(_ 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_GroupTopAdminKicks(_ 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 Notifications_ExceptionMuteExpires_Hours(_ 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 MessageTimer_ShortHours(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[142 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[47 * 6 + Int(form.rawValue)]!, stringValue) } - public func Watch_LastSeen_HoursAgo(_ value: Int32) -> String { + public func SharedMedia_File(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[143 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[48 * 6 + Int(form.rawValue)]!, stringValue) } - public func InviteText_ContactsCountText(_ value: Int32) -> String { + public func Stats_GroupTopAdminBans(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[144 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[49 * 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[50 * 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[51 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func MessageTimer_Seconds(_ 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 Chat_DeleteMessagesConfirmation(_ 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 PUSH_CHANNEL_MESSAGE_FWDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[54 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func ChatListFilter_ShowMoreChats(_ 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 StickerPack_AddMaskCount(_ 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 Notification_GameScoreExtended(_ 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 MessageTimer_ShortMinutes(_ 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 OldChannels_InactiveWeek(_ 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 Conversation_TitleComments(_ 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 Media_SharePhoto(_ 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) + } + public func Media_ShareItem(_ 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) + } + public func PUSH_CHANNEL_MESSAGE_VIDEOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[64 * 6 + Int(form.rawValue)]!, _1, _2) + } + 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[65 * 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[66 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PrivacyLastSeenSettings_AddUsers(_ 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 OldChannels_InactiveYear(_ 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 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) + } + public func UserCount(_ 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 ForwardedLocations(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[71 * 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[72 * 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[73 * 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[74 * 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[75 * 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[76 * 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[77 * 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[78 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Stats_GroupTopAdminDeletions(_ 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 Watch_LastSeen_MinutesAgo(_ 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 MessageTimer_ShortWeeks(_ 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 Notification_GameScoreSimple(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[82 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Stats_GroupShowMoreTopAdmins(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[83 * 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[84 * 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[85 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MuteFor_Days(_ 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 PUSH_CHAT_MESSAGES(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[87 * 6 + Int(form.rawValue)]!, _2, _1, _3) + } + public func MessageTimer_Months(_ 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 Conversation_SelectedMessages(_ 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_MessagePhotos(_ 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_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 Wallet_Updated_HoursAgo(_ 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 ForwardedPolls(_ 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 Call_Seconds(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[145 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[94 * 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[95 * 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[96 * 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[97 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Conversation_TitleReplies(_ 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 SharedMedia_DeleteItemsConfirmation(_ 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 ForwardedPhotos(_ 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 Passport_Scans(_ 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 VoiceOver_Chat_ContactEmailCount(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[102 * 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[103 * 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[104 * 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[105 * 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[106 * 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[107 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Wallpaper_DeleteConfirmation(_ 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 Conversation_ContextViewReplies(_ 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 ChatList_SelectedChats(_ 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 StickerPack_StickerCount(_ 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) + } + public func Map_ETAMinutes(_ 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 Stats_GroupShowMoreTopPosters(_ 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 MuteExpires_Days(_ 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 PasscodeSettings_FailedAttempts(_ 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) + } + public func Forward_ConfirmMultipleFiles(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[116 * 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[117 * 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[118 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessageTimer_Days(_ 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 ChatList_Search_Messages(_ 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 ForwardedAuthorsOthers(_ selector: Int32, _ _0: String, _ _1: String) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[121 * 6 + Int(form.rawValue)]!, _0, _1) + } + public func Stats_GroupTopPosterChars(_ 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 Notification_GameScoreSelfExtended(_ 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 PUSH_CHANNEL_MESSAGE_PHOTOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[124 * 6 + Int(form.rawValue)]!, _1, _2) + } + 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[125 * 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[126 * 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[127 * 6 + Int(form.rawValue)]!, _2, _1, _3) + } + 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[128 * 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[129 * 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[130 * 6 + Int(form.rawValue)]!, _1, _2) + } + 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[131 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Conversation_MessageViewComments(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[132 * 6 + Int(form.rawValue)]!, stringValue) + } + public func QuickSend_Photos(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[133 * 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[134 * 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[135 * 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[136 * 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[137 * 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[138 * 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[139 * 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[140 * 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[141 * 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[142 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_MESSAGES(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[143 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func ForwardedContacts(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[144 * 6 + Int(form.rawValue)]!, stringValue) } public func ForwardedMessages(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[145 * 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[146 * 6 + Int(form.rawValue)]!, stringValue) diff --git a/submodules/TelegramUI/Resources/PresentationStrings.mapping b/submodules/TelegramUI/Resources/PresentationStrings.mapping index d941da328b653f2b2723377ee1444a538988f82c..3fc340060574a010f0efe8af6353fced1837affd 100644 GIT binary patch delta 9019 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 diff --git a/submodules/TelegramUI/Sources/ChatController.swift b/submodules/TelegramUI/Sources/ChatController.swift index 41e66add9f..bd20d1d110 100644 --- a/submodules/TelegramUI/Sources/ChatController.swift +++ b/submodules/TelegramUI/Sources/ChatController.swift @@ -3268,13 +3268,15 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G } if case let .replyThread(replyThreadMessageId) = strongSelf.chatLocation { - pinnedMessageId = replyThreadMessageId.messageId + pinnedMessageId = replyThreadMessageId.effectiveTopId } - var pinnedMessage: Message? + var pinnedMessage: ChatPinnedMessage? if let pinnedMessageId = pinnedMessageId { if let cachedDataMessages = combinedInitialData.cachedDataMessages { - pinnedMessage = cachedDataMessages[pinnedMessageId] + if let message = cachedDataMessages[pinnedMessageId] { + pinnedMessage = ChatPinnedMessage(message: message, isLatest: true) + } } } @@ -3385,7 +3387,62 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G let isTopReplyThreadMessageShown: Signal = self.chatDisplayNode.historyNode.isTopReplyThreadMessageShown.get() |> distinctUntilChanged - self.cachedDataDisposable = combineLatest(queue: .mainQueue(), self.chatDisplayNode.historyNode.cachedPeerDataAndMessages, hasPendingMessages, isTopReplyThreadMessageShown).start(next: { [weak self] cachedDataAndMessages, hasPendingMessages, isTopReplyThreadMessageShown in + let topPinnedMessage: Signal + switch self.chatLocation { + case let .peer(peerId): + let replyHistory: Signal = (chatHistoryViewForLocation(ChatHistoryLocationInput(content: .Initial(count: 100), id: 0), context: self.context, chatLocation: .peer(peerId), chatLocationContextHolder: Atomic(value: nil), scheduled: false, fixedCombinedReadStates: nil, tagMask: MessageTags.photoOrVideo, additionalData: []) + |> castError(Bool.self) + |> mapToSignal { update -> Signal in + switch update { + case let .Loading(_, type): + if case .Generic(.FillHole) = type { + return .fail(true) + } + case let .HistoryView(_, type, _, _, _, _, _): + if case .Generic(.FillHole) = type { + return .fail(true) + } + } + return .single(update) + }) + |> restartIfError + + topPinnedMessage = combineLatest( + replyHistory, + self.chatDisplayNode.historyNode.topVisibleMessage.get() + ) + |> map { update, topVisibleMessage -> ChatPinnedMessage? in + var message: ChatPinnedMessage? + switch update { + case .Loading: + break + case let .HistoryView(view, _, _, _, _, _, _): + for i in 0 ..< view.entries.count { + let entry = view.entries[i] + var matches = false + if message == nil { + matches = true + } else if let topVisibleMessage = topVisibleMessage { + if entry.message.id < topVisibleMessage.id { + matches = true + } + } else { + matches = true + } + if matches { + message = ChatPinnedMessage(message: entry.message, isLatest: i == view.entries.count - 1) + } + } + break + } + return message + } + |> distinctUntilChanged + case .replyThread: + topPinnedMessage = .single(nil) + } + + self.cachedDataDisposable = combineLatest(queue: .mainQueue(), self.chatDisplayNode.historyNode.cachedPeerDataAndMessages, hasPendingMessages, isTopReplyThreadMessageShown, topPinnedMessage).start(next: { [weak self] cachedDataAndMessages, hasPendingMessages, isTopReplyThreadMessageShown, topPinnedMessage in if let strongSelf = self { let (cachedData, messages) = cachedDataAndMessages @@ -3413,22 +3470,26 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G } else if let _ = cachedData as? CachedSecretChatData { } + var pinnedMessage: ChatPinnedMessage? if case let .replyThread(replyThreadMessage) = strongSelf.chatLocation { if isTopReplyThreadMessageShown { pinnedMessageId = nil } else { - pinnedMessageId = replyThreadMessage.messageId + pinnedMessageId = replyThreadMessage.effectiveTopId } - } - - var pinnedMessage: Message? - if let pinnedMessageId = pinnedMessageId { - pinnedMessage = messages?[pinnedMessageId] + if let pinnedMessageId = pinnedMessageId { + if let message = messages?[pinnedMessageId] { + pinnedMessage = ChatPinnedMessage(message: message, isLatest: true) + } + } + } else { + pinnedMessageId = topPinnedMessage?.message.id + pinnedMessage = topPinnedMessage } var pinnedMessageUpdated = false if let current = strongSelf.presentationInterfaceState.pinnedMessage, let updated = pinnedMessage { - if current.id != updated.id || current.stableVersion != updated.stableVersion { + if current != updated { pinnedMessageUpdated = true } } else if (strongSelf.presentationInterfaceState.pinnedMessage != nil) != (pinnedMessage != nil) { @@ -3437,7 +3498,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G let callsDataUpdated = strongSelf.presentationInterfaceState.callsAvailable != callsAvailable || strongSelf.presentationInterfaceState.callsPrivate != callsPrivate - if strongSelf.presentationInterfaceState.pinnedMessageId != pinnedMessageId || strongSelf.presentationInterfaceState.pinnedMessage?.stableVersion != pinnedMessage?.stableVersion || strongSelf.presentationInterfaceState.peerIsBlocked != peerIsBlocked || pinnedMessageUpdated || callsDataUpdated || strongSelf.presentationInterfaceState.slowmodeState != slowmodeState { + if strongSelf.presentationInterfaceState.pinnedMessageId != pinnedMessageId || strongSelf.presentationInterfaceState.pinnedMessage != pinnedMessage || strongSelf.presentationInterfaceState.peerIsBlocked != peerIsBlocked || pinnedMessageUpdated || callsDataUpdated || strongSelf.presentationInterfaceState.slowmodeState != slowmodeState { strongSelf.updateChatPresentationInterfaceState(animated: strongSelf.willAppear, interactive: strongSelf.willAppear, { state in return state .updatedPinnedMessageId(pinnedMessageId) @@ -4734,7 +4795,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G })]), in: .window(.root)) } } else { - if let pinnedMessageId = strongSelf.presentationInterfaceState.pinnedMessage?.id { + if let pinnedMessageId = strongSelf.presentationInterfaceState.pinnedMessage?.message.id { strongSelf.updateChatPresentationInterfaceState(animated: true, interactive: true, { return $0.updatedInterfaceState({ $0.withUpdatedMessageActionsState({ value in var value = value @@ -4786,7 +4847,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G strongSelf.updateChatPresentationInterfaceState(animated: true, interactive: true, { return $0.updatedInterfaceState({ $0.withUpdatedMessageActionsState({ value in var value = value - value.closedPinnedMessageId = pinnedMessage.id + value.closedPinnedMessageId = pinnedMessage.message.id return value }) }) }) diff --git a/submodules/TelegramUI/Sources/ChatControllerNode.swift b/submodules/TelegramUI/Sources/ChatControllerNode.swift index 949e67c95d..43e4e6865b 100644 --- a/submodules/TelegramUI/Sources/ChatControllerNode.swift +++ b/submodules/TelegramUI/Sources/ChatControllerNode.swift @@ -997,7 +997,7 @@ class ChatControllerNode: ASDisplayNode, UIScrollViewDelegate { } } - if let pinnedMessage = self.chatPresentationInterfaceState.pinnedMessage, self.context.sharedContext.immediateExperimentalUISettings.playerEmbedding, self.context.sharedContext.immediateExperimentalUISettings.playlistPlayback, self.embeddedTitleContentNode == nil, let url = extractExperimentalPlaylistUrl(pinnedMessage.text), self.didProcessExperimentalEmbedUrl != url { + if let pinnedMessage = self.chatPresentationInterfaceState.pinnedMessage, self.context.sharedContext.immediateExperimentalUISettings.playerEmbedding, self.context.sharedContext.immediateExperimentalUISettings.playlistPlayback, self.embeddedTitleContentNode == nil, let url = extractExperimentalPlaylistUrl(pinnedMessage.message.text), self.didProcessExperimentalEmbedUrl != url { self.didProcessExperimentalEmbedUrl = url let context = self.context let baseNavigationController = self.controller?.navigationController as? NavigationController diff --git a/submodules/TelegramUI/Sources/ChatHistoryListNode.swift b/submodules/TelegramUI/Sources/ChatHistoryListNode.swift index 61122e1940..37ed46c24a 100644 --- a/submodules/TelegramUI/Sources/ChatHistoryListNode.swift +++ b/submodules/TelegramUI/Sources/ChatHistoryListNode.swift @@ -24,6 +24,11 @@ extension ChatReplyThreadMessage { } } +struct ChatTopVisibleMessage: Equatable { + var id: MessageId + var isLast: Bool +} + private class ChatHistoryListSelectionRecognizer: UIPanGestureRecognizer { private let selectionGestureActivationThreshold: CGFloat = 5.0 @@ -557,6 +562,7 @@ public final class ChatHistoryListNode: ListView, ChatHistoryNode { private var loadedMessagesFromCachedDataDisposable: Disposable? let isTopReplyThreadMessageShown = ValuePromise(false, ignoreRepeated: true) + let topVisibleMessage = ValuePromise(nil, ignoreRepeated: true) private let clientId: Atomic @@ -1151,6 +1157,7 @@ public final class ChatHistoryListNode: ListView, ChatHistoryNode { private func processDisplayedItemRangeChanged(displayedRange: ListViewDisplayedItemRange, transactionState: ChatHistoryTransactionOpaqueState) { let historyView = transactionState.historyView var isTopReplyThreadMessageShownValue = false + var topVisibleMessage: ChatTopVisibleMessage? if let visible = displayedRange.visibleRange { let indexRange = (historyView.filteredEntries.count - 1 - visible.lastIndex, historyView.filteredEntries.count - 1 - visible.firstIndex) if indexRange.0 > indexRange.1 { @@ -1225,6 +1232,7 @@ public final class ChatHistoryListNode: ListView, ChatHistoryNode { if case let .replyThread(replyThreadMessage) = self.chatLocation, replyThreadMessage.effectiveTopId == message.id { isTopReplyThreadMessageShownValue = true } + topVisibleMessage = ChatTopVisibleMessage(id: message.id, isLast: i == historyView.filteredEntries.count - 1) case let .MessageGroupEntry(_, messages, _): for (message, _, _, _) in messages { var hasUnconsumedMention = false @@ -1255,6 +1263,7 @@ public final class ChatHistoryListNode: ListView, ChatHistoryNode { if case let .replyThread(replyThreadMessage) = self.chatLocation, replyThreadMessage.effectiveTopId == message.id { isTopReplyThreadMessageShownValue = true } + topVisibleMessage = ChatTopVisibleMessage(id: message.id, isLast: i == historyView.filteredEntries.count - 1) } default: break @@ -1371,6 +1380,7 @@ public final class ChatHistoryListNode: ListView, ChatHistoryNode { } } self.isTopReplyThreadMessageShown.set(isTopReplyThreadMessageShownValue) + self.topVisibleMessage.set(topVisibleMessage) if let loaded = displayedRange.loadedRange, let firstEntry = historyView.filteredEntries.first, let lastEntry = historyView.filteredEntries.last { if loaded.firstIndex < 5 && historyView.originalView.laterId != nil { diff --git a/submodules/TelegramUI/Sources/ChatInterfaceStateContextMenus.swift b/submodules/TelegramUI/Sources/ChatInterfaceStateContextMenus.swift index 3c505b404d..89565472e1 100644 --- a/submodules/TelegramUI/Sources/ChatInterfaceStateContextMenus.swift +++ b/submodules/TelegramUI/Sources/ChatInterfaceStateContextMenus.swift @@ -643,7 +643,7 @@ func contextMenuForChatPresentationIntefaceState(chatPresentationInterfaceState: } if data.canPin, case .peer = chatPresentationInterfaceState.chatLocation { - if chatPresentationInterfaceState.pinnedMessage?.id != messages[0].id { + if chatPresentationInterfaceState.pinnedMessage?.message.id != messages[0].id { actions.append(.action(ContextMenuActionItem(text: chatPresentationInterfaceState.strings.Conversation_Pin, icon: { theme in return generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Pin"), color: theme.actionSheet.primaryTextColor) }, action: { _, f in diff --git a/submodules/TelegramUI/Sources/ChatInterfaceStateContextQueries.swift b/submodules/TelegramUI/Sources/ChatInterfaceStateContextQueries.swift index 1fc95214f1..f3b0b519de 100644 --- a/submodules/TelegramUI/Sources/ChatInterfaceStateContextQueries.swift +++ b/submodules/TelegramUI/Sources/ChatInterfaceStateContextQueries.swift @@ -145,7 +145,7 @@ private func updatedContextQueryResultStateForQuery(context: AccountContext, pee } let inlineBots: Signal<[(Peer, Double)], NoError> = types.contains(.contextBots) ? recentlyUsedInlineBots(postbox: context.account.postbox) : .single([]) - let participants = combineLatest(inlineBots, searchPeerMembers(context: context, peerId: peer.id, chatLocation: chatLocation, query: query)) + let participants = combineLatest(inlineBots, searchPeerMembers(context: context, peerId: peer.id, chatLocation: chatLocation, query: query, scope: .mention)) |> map { inlineBots, peers -> (ChatPresentationInputQueryResult?) -> ChatPresentationInputQueryResult? in let filteredInlineBots = inlineBots.sorted(by: { $0.1 > $1.1 }).filter { peer, rating in if rating < 0.14 { @@ -347,7 +347,7 @@ func searchQuerySuggestionResultStateForChatInterfacePresentationState(_ chatPre } } - let participants = searchPeerMembers(context: context, peerId: peer.id, chatLocation: chatPresentationInterfaceState.chatLocation, query: query) + let participants = searchPeerMembers(context: context, peerId: peer.id, chatLocation: chatPresentationInterfaceState.chatLocation, query: query, scope: .memberSuggestion) |> map { peers -> (ChatPresentationInputQueryResult?) -> ChatPresentationInputQueryResult? in let filteredPeers = peers var sortedPeers: [Peer] = [] diff --git a/submodules/TelegramUI/Sources/ChatInterfaceTitlePanelNodes.swift b/submodules/TelegramUI/Sources/ChatInterfaceTitlePanelNodes.swift index e41c833fcd..9b40aa2467 100644 --- a/submodules/TelegramUI/Sources/ChatInterfaceTitlePanelNodes.swift +++ b/submodules/TelegramUI/Sources/ChatInterfaceTitlePanelNodes.swift @@ -19,7 +19,7 @@ func titlePanelForChatPresentationInterfaceState(_ chatPresentationInterfaceStat loop: for context in chatPresentationInterfaceState.titlePanelContexts.reversed() { switch context { case .pinnedMessage: - if let pinnedMessage = chatPresentationInterfaceState.pinnedMessage, pinnedMessage.id != chatPresentationInterfaceState.interfaceState.messageActionsState.closedPinnedMessageId { + if let pinnedMessage = chatPresentationInterfaceState.pinnedMessage, pinnedMessage.message.id != chatPresentationInterfaceState.interfaceState.messageActionsState.closedPinnedMessageId { selectedContext = context break loop } diff --git a/submodules/TelegramUI/Sources/ChatPinnedMessageTitlePanelNode.swift b/submodules/TelegramUI/Sources/ChatPinnedMessageTitlePanelNode.swift index 4cddcd270a..298dc83e14 100644 --- a/submodules/TelegramUI/Sources/ChatPinnedMessageTitlePanelNode.swift +++ b/submodules/TelegramUI/Sources/ChatPinnedMessageTitlePanelNode.swift @@ -13,10 +13,18 @@ import StickerResources import PhotoResources import TelegramStringFormatting +private enum PinnedMessageAnimation { + case slideToTop + case slideToBottom +} + final class ChatPinnedMessageTitlePanelNode: ChatTitleAccessoryPanelNode { private let context: AccountContext private let tapButton: HighlightTrackingButtonNode private let closeButton: HighlightableButtonNode + + private let clippingContainer: ASDisplayNode + private let contentContainer: ASDisplayNode private let lineNode: ASImageNode private let titleNode: TextNode private let textNode: TextNode @@ -25,7 +33,7 @@ final class ChatPinnedMessageTitlePanelNode: ChatTitleAccessoryPanelNode { private let separatorNode: ASDisplayNode private var currentLayout: (CGFloat, CGFloat, CGFloat)? - private var currentMessage: Message? + private var currentMessage: ChatPinnedMessage? private var previousMediaReference: AnyMediaReference? private var isReplyThread: Bool = false @@ -46,6 +54,11 @@ final class ChatPinnedMessageTitlePanelNode: ChatTitleAccessoryPanelNode { self.separatorNode = ASDisplayNode() self.separatorNode.isLayerBacked = true + self.clippingContainer = ASDisplayNode() + self.clippingContainer.clipsToBounds = true + + self.contentContainer = ASDisplayNode() + self.lineNode = ASImageNode() self.lineNode.displayWithoutProcessing = true self.lineNode.displaysAsynchronously = false @@ -87,10 +100,12 @@ final class ChatPinnedMessageTitlePanelNode: ChatTitleAccessoryPanelNode { self.closeButton.addTarget(self, action: #selector(self.closePressed), forControlEvents: [.touchUpInside]) self.addSubnode(self.closeButton) + self.addSubnode(self.clippingContainer) + self.clippingContainer.addSubnode(self.contentContainer) self.addSubnode(self.lineNode) - self.addSubnode(self.titleNode) - self.addSubnode(self.textNode) - self.addSubnode(self.imageNode) + self.contentContainer.addSubnode(self.titleNode) + self.contentContainer.addSubnode(self.textNode) + self.contentContainer.addSubnode(self.imageNode) self.tapButton.addTarget(self, action: #selector(self.tapped), forControlEvents: [.touchUpInside]) self.addSubnode(self.tapButton) @@ -128,10 +143,18 @@ final class ChatPinnedMessageTitlePanelNode: ChatTitleAccessoryPanelNode { self.closeButton.isHidden = isReplyThread var messageUpdated = false + var messageUpdatedAnimation: PinnedMessageAnimation? if let currentMessage = self.currentMessage, let pinnedMessage = interfaceState.pinnedMessage { - if currentMessage.id != pinnedMessage.id || currentMessage.stableVersion != pinnedMessage.stableVersion { + if currentMessage != pinnedMessage { messageUpdated = true } + if currentMessage.message.id != pinnedMessage.message.id { + if currentMessage.message.id < pinnedMessage.message.id { + messageUpdatedAnimation = .slideToTop + } else { + messageUpdatedAnimation = .slideToBottom + } + } } else if (self.currentMessage != nil) != (interfaceState.pinnedMessage != nil) { messageUpdated = true } @@ -141,7 +164,7 @@ final class ChatPinnedMessageTitlePanelNode: ChatTitleAccessoryPanelNode { self.currentMessage = interfaceState.pinnedMessage if let currentMessage = currentMessage, let currentLayout = self.currentLayout { - self.enqueueTransition(width: currentLayout.0, leftInset: currentLayout.1, rightInset: currentLayout.2, transition: .immediate, message: currentMessage, theme: interfaceState.theme, strings: interfaceState.strings, nameDisplayOrder: interfaceState.nameDisplayOrder, accountPeerId: self.context.account.peerId, firstTime: previousMessageWasNil, isReplyThread: isReplyThread) + self.enqueueTransition(width: currentLayout.0, leftInset: currentLayout.1, rightInset: currentLayout.2, transition: .immediate, animation: messageUpdatedAnimation, pinnedMessage: currentMessage, theme: interfaceState.theme, strings: interfaceState.strings, nameDisplayOrder: interfaceState.nameDisplayOrder, accountPeerId: self.context.account.peerId, firstTime: previousMessageWasNil, isReplyThread: isReplyThread) } } @@ -156,18 +179,43 @@ final class ChatPinnedMessageTitlePanelNode: ChatTitleAccessoryPanelNode { transition.updateFrame(node: self.separatorNode, frame: CGRect(origin: CGPoint(x: 0.0, y: panelHeight - UIScreenPixel), size: CGSize(width: width, height: UIScreenPixel))) self.tapButton.frame = CGRect(origin: CGPoint(), size: CGSize(width: width - rightInset - closeButtonSize.width - 4.0, height: panelHeight)) + self.clippingContainer.frame = CGRect(origin: CGPoint(), size: CGSize(width: width, height: panelHeight)) + self.contentContainer.frame = CGRect(origin: CGPoint(), size: CGSize(width: width, height: panelHeight)) + if self.currentLayout?.0 != width || self.currentLayout?.1 != leftInset || self.currentLayout?.2 != rightInset { self.currentLayout = (width, leftInset, rightInset) if let currentMessage = self.currentMessage { - self.enqueueTransition(width: width, leftInset: leftInset, rightInset: rightInset, transition: .immediate, message: currentMessage, theme: interfaceState.theme, strings: interfaceState.strings, nameDisplayOrder: interfaceState.nameDisplayOrder, accountPeerId: interfaceState.accountPeerId, firstTime: true, isReplyThread: isReplyThread) + self.enqueueTransition(width: width, leftInset: leftInset, rightInset: rightInset, transition: .immediate, animation: .none, pinnedMessage: currentMessage, theme: interfaceState.theme, strings: interfaceState.strings, nameDisplayOrder: interfaceState.nameDisplayOrder, accountPeerId: interfaceState.accountPeerId, firstTime: true, isReplyThread: isReplyThread) } } return panelHeight } - private func enqueueTransition(width: CGFloat, leftInset: CGFloat, rightInset: CGFloat, transition: ContainedViewLayoutTransition, message: Message, theme: PresentationTheme, strings: PresentationStrings, nameDisplayOrder: PresentationPersonNameOrder, accountPeerId: PeerId, firstTime: Bool, isReplyThread: Bool) { + private func enqueueTransition(width: CGFloat, leftInset: CGFloat, rightInset: CGFloat, transition: ContainedViewLayoutTransition, animation: PinnedMessageAnimation?, pinnedMessage: ChatPinnedMessage, theme: PresentationTheme, strings: PresentationStrings, nameDisplayOrder: PresentationPersonNameOrder, accountPeerId: PeerId, firstTime: Bool, isReplyThread: Bool) { + let message = pinnedMessage.message + + if let animation = animation { + let offset: CGFloat + switch animation { + case .slideToTop: + offset = -40.0 + case .slideToBottom: + offset = 40.0 + } + if let copyView = self.contentContainer.view.snapshotView(afterScreenUpdates: false) { + copyView.frame = self.contentContainer.frame + self.clippingContainer.view.addSubview(copyView) + copyView.layer.animatePosition(from: CGPoint(), to: CGPoint(x: 0.0, y: offset), duration: 0.2, removeOnCompletion: false, additive: true) + copyView.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.2, removeOnCompletion: false, completion: { [weak copyView] _ in + copyView?.removeFromSuperview() + }) + self.contentContainer.layer.animatePosition(from: CGPoint(x: 0.0, y: -offset), to: CGPoint(), duration: 0.2, additive: true) + self.contentContainer.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.2) + } + } + let makeTitleLayout = TextNode.asyncLayout(self.titleNode) let makeTextLayout = TextNode.asyncLayout(self.textNode) let imageNodeLayout = self.imageNode.asyncLayout() @@ -191,7 +239,12 @@ final class ChatPinnedMessageTitlePanelNode: ChatTitleAccessoryPanelNode { var updatedMediaReference: AnyMediaReference? var imageDimensions: CGSize? - var titleString = strings.Conversation_PinnedMessage + var titleString: String + if pinnedMessage.isLatest { + titleString = strings.Conversation_PinnedMessage + } else { + titleString = strings.Conversation_PinnedPreviousMessage + } for media in message.media { if let image = media as? TelegramMediaImage { @@ -300,13 +353,8 @@ final class ChatPinnedMessageTitlePanelNode: ChatTitleAccessoryPanelNode { if let interfaceInteraction = self.interfaceInteraction, let message = self.currentMessage { if self.isReplyThread { interfaceInteraction.scrollToTop() - /*if let sourceReference = message.sourceReference { - interfaceInteraction.navigateToMessage(sourceReference.messageId, true) - } else { - interfaceInteraction.navigateToMessage(message.id, false) - }*/ } else { - interfaceInteraction.navigateToMessage(message.id, false) + interfaceInteraction.navigateToMessage(message.message.id, false) } } } diff --git a/submodules/TelegramUI/Sources/ChatPresentationInterfaceState.swift b/submodules/TelegramUI/Sources/ChatPresentationInterfaceState.swift index 1be0b8f25f..54f76b2d61 100644 --- a/submodules/TelegramUI/Sources/ChatPresentationInterfaceState.swift +++ b/submodules/TelegramUI/Sources/ChatPresentationInterfaceState.swift @@ -257,6 +257,32 @@ struct ChatSlowmodeState: Equatable { var variant: ChatSlowmodeVariant } +final class ChatPinnedMessage: Equatable { + let message: Message + let isLatest: Bool + + init(message: Message, isLatest: Bool) { + self.message = message + self.isLatest = isLatest + } + + static func ==(lhs: ChatPinnedMessage, rhs: ChatPinnedMessage) -> Bool { + if lhs === rhs { + return true + } + if lhs.message.id != rhs.message.id { + return false + } + if lhs.message.stableVersion != rhs.message.stableVersion { + return false + } + if lhs.isLatest != rhs.isLatest { + return false + } + return true + } +} + final class ChatPresentationInterfaceState: Equatable { let interfaceState: ChatInterfaceState let chatLocation: ChatLocation @@ -274,7 +300,7 @@ final class ChatPresentationInterfaceState: Equatable { let titlePanelContexts: [ChatTitlePanelContext] let keyboardButtonsMessage: Message? let pinnedMessageId: MessageId? - let pinnedMessage: Message? + let pinnedMessage: ChatPinnedMessage? let peerIsBlocked: Bool let peerIsMuted: Bool let peerDiscussionId: PeerId? @@ -348,7 +374,7 @@ final class ChatPresentationInterfaceState: Equatable { self.peerNearbyData = peerNearbyData } - init(interfaceState: ChatInterfaceState, chatLocation: ChatLocation, renderedPeer: RenderedPeer?, isNotAccessible: Bool, explicitelyCanPinMessages: Bool, contactStatus: ChatContactStatus?, hasBots: Bool, isArchived: Bool, inputTextPanelState: ChatTextInputPanelState, editMessageState: ChatEditInterfaceMessageState?, recordedMediaPreview: ChatRecordedMediaPreview?, inputQueryResults: [ChatPresentationInputQueryKind: ChatPresentationInputQueryResult], inputMode: ChatInputMode, titlePanelContexts: [ChatTitlePanelContext], keyboardButtonsMessage: Message?, pinnedMessageId: MessageId?, pinnedMessage: Message?, peerIsBlocked: Bool, peerIsMuted: Bool, peerDiscussionId: PeerId?, peerGeoLocation: PeerGeoLocation?, callsAvailable: Bool, callsPrivate: Bool, slowmodeState: ChatSlowmodeState?, chatHistoryState: ChatHistoryNodeHistoryState?, botStartPayload: String?, urlPreview: (String, TelegramMediaWebpage)?, editingUrlPreview: (String, TelegramMediaWebpage)?, search: ChatSearchData?, searchQuerySuggestionResult: ChatPresentationInputQueryResult?, chatWallpaper: TelegramWallpaper, theme: PresentationTheme, strings: PresentationStrings, dateTimeFormat: PresentationDateTimeFormat, nameDisplayOrder: PresentationPersonNameOrder, limitsConfiguration: LimitsConfiguration, fontSize: PresentationFontSize, bubbleCorners: PresentationChatBubbleCorners, accountPeerId: PeerId, mode: ChatControllerPresentationMode, hasScheduledMessages: Bool, isScheduledMessages: Bool, peerNearbyData: ChatPeerNearbyData?) { + init(interfaceState: ChatInterfaceState, chatLocation: ChatLocation, renderedPeer: RenderedPeer?, isNotAccessible: Bool, explicitelyCanPinMessages: Bool, contactStatus: ChatContactStatus?, hasBots: Bool, isArchived: Bool, inputTextPanelState: ChatTextInputPanelState, editMessageState: ChatEditInterfaceMessageState?, recordedMediaPreview: ChatRecordedMediaPreview?, inputQueryResults: [ChatPresentationInputQueryKind: ChatPresentationInputQueryResult], inputMode: ChatInputMode, titlePanelContexts: [ChatTitlePanelContext], keyboardButtonsMessage: Message?, pinnedMessageId: MessageId?, pinnedMessage: ChatPinnedMessage?, peerIsBlocked: Bool, peerIsMuted: Bool, peerDiscussionId: PeerId?, peerGeoLocation: PeerGeoLocation?, callsAvailable: Bool, callsPrivate: Bool, slowmodeState: ChatSlowmodeState?, chatHistoryState: ChatHistoryNodeHistoryState?, botStartPayload: String?, urlPreview: (String, TelegramMediaWebpage)?, editingUrlPreview: (String, TelegramMediaWebpage)?, search: ChatSearchData?, searchQuerySuggestionResult: ChatPresentationInputQueryResult?, chatWallpaper: TelegramWallpaper, theme: PresentationTheme, strings: PresentationStrings, dateTimeFormat: PresentationDateTimeFormat, nameDisplayOrder: PresentationPersonNameOrder, limitsConfiguration: LimitsConfiguration, fontSize: PresentationFontSize, bubbleCorners: PresentationChatBubbleCorners, accountPeerId: PeerId, mode: ChatControllerPresentationMode, hasScheduledMessages: Bool, isScheduledMessages: Bool, peerNearbyData: ChatPeerNearbyData?) { self.interfaceState = interfaceState self.chatLocation = chatLocation self.renderedPeer = renderedPeer @@ -447,14 +473,7 @@ final class ChatPresentationInterfaceState: Equatable { if lhs.pinnedMessageId != rhs.pinnedMessageId { return false } - if let lhsMessage = lhs.pinnedMessage, let rhsMessage = rhs.pinnedMessage { - if lhsMessage.id != rhsMessage.id { - return false - } - if lhsMessage.stableVersion != rhsMessage.stableVersion { - return false - } - } else if (lhs.pinnedMessage != nil) != (rhs.pinnedMessage != nil) { + if lhs.pinnedMessage != rhs.pinnedMessage { return false } if lhs.callsAvailable != rhs.callsAvailable { @@ -613,7 +632,7 @@ final class ChatPresentationInterfaceState: Equatable { return ChatPresentationInterfaceState(interfaceState: self.interfaceState, chatLocation: self.chatLocation, renderedPeer: self.renderedPeer, isNotAccessible: self.isNotAccessible, explicitelyCanPinMessages: self.explicitelyCanPinMessages, contactStatus: self.contactStatus, hasBots: self.hasBots, isArchived: self.isArchived, inputTextPanelState: self.inputTextPanelState, editMessageState: self.editMessageState, recordedMediaPreview: self.recordedMediaPreview, inputQueryResults: self.inputQueryResults, inputMode: self.inputMode, titlePanelContexts: self.titlePanelContexts, keyboardButtonsMessage: self.keyboardButtonsMessage, pinnedMessageId: pinnedMessageId, pinnedMessage: self.pinnedMessage, peerIsBlocked: self.peerIsBlocked, peerIsMuted: self.peerIsMuted, peerDiscussionId: self.peerDiscussionId, peerGeoLocation: self.peerGeoLocation, callsAvailable: self.callsAvailable, callsPrivate: self.callsPrivate, slowmodeState: self.slowmodeState, chatHistoryState: self.chatHistoryState, botStartPayload: self.botStartPayload, urlPreview: self.urlPreview, editingUrlPreview: self.editingUrlPreview, search: self.search, searchQuerySuggestionResult: self.searchQuerySuggestionResult, chatWallpaper: self.chatWallpaper, theme: self.theme, strings: self.strings, dateTimeFormat: self.dateTimeFormat, nameDisplayOrder: self.nameDisplayOrder, limitsConfiguration: self.limitsConfiguration, fontSize: self.fontSize, bubbleCorners: self.bubbleCorners, accountPeerId: self.accountPeerId, mode: self.mode, hasScheduledMessages: self.hasScheduledMessages, isScheduledMessages: self.isScheduledMessages, peerNearbyData: self.peerNearbyData) } - func updatedPinnedMessage(_ pinnedMessage: Message?) -> ChatPresentationInterfaceState { + func updatedPinnedMessage(_ pinnedMessage: ChatPinnedMessage?) -> ChatPresentationInterfaceState { return ChatPresentationInterfaceState(interfaceState: self.interfaceState, chatLocation: self.chatLocation, renderedPeer: self.renderedPeer, isNotAccessible: self.isNotAccessible, explicitelyCanPinMessages: self.explicitelyCanPinMessages, contactStatus: self.contactStatus, hasBots: self.hasBots, isArchived: self.isArchived, inputTextPanelState: self.inputTextPanelState, editMessageState: self.editMessageState, recordedMediaPreview: self.recordedMediaPreview, inputQueryResults: self.inputQueryResults, inputMode: self.inputMode, titlePanelContexts: self.titlePanelContexts, keyboardButtonsMessage: self.keyboardButtonsMessage, pinnedMessageId: self.pinnedMessageId, pinnedMessage: pinnedMessage, peerIsBlocked: self.peerIsBlocked, peerIsMuted: self.peerIsMuted, peerDiscussionId: self.peerDiscussionId, peerGeoLocation: self.peerGeoLocation, callsAvailable: self.callsAvailable, callsPrivate: self.callsPrivate, slowmodeState: self.slowmodeState, chatHistoryState: self.chatHistoryState, botStartPayload: self.botStartPayload, urlPreview: self.urlPreview, editingUrlPreview: self.editingUrlPreview, search: self.search, searchQuerySuggestionResult: self.searchQuerySuggestionResult, chatWallpaper: self.chatWallpaper, theme: self.theme, strings: self.strings, dateTimeFormat: self.dateTimeFormat, nameDisplayOrder: self.nameDisplayOrder, limitsConfiguration: self.limitsConfiguration, fontSize: self.fontSize, bubbleCorners: self.bubbleCorners, accountPeerId: self.accountPeerId, mode: self.mode, hasScheduledMessages: self.hasScheduledMessages, isScheduledMessages: self.isScheduledMessages, peerNearbyData: self.peerNearbyData) } diff --git a/submodules/WalletUI/Resources/WalletStrings.mapping b/submodules/WalletUI/Resources/WalletStrings.mapping index 0f39866777c67e74b19a01f779b9a0361509e1f3..17cc3a5663f90f1755dec9124d0cbe37c00f5e0b 100644 GIT binary patch delta 17 ZcmaFn_{?#`Duv0X6{Hy%Cofk}002q>2HpSw delta 17 ZcmaFn_{?#`Duu}>6=WG1Cofl!0{}_;2HXGu diff --git a/submodules/WalletUI/Sources/WalletStrings.swift b/submodules/WalletUI/Sources/WalletStrings.swift index b5d79e61f2..ce409636d3 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_Send_ConfirmationConfirm: String { return self._s[218]! } public var Wallet_Created_ExportErrorTitle: String { return self._s[219]! } public var Wallet_Info_TransactionPendingHeader: String { return self._s[220]! } - 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[0 * 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 = walletStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[1 * 6 + Int(form.rawValue)]!, stringValue) From e7e9e9353574ffd55517de3771c45e6745320bd3 Mon Sep 17 00:00:00 2001 From: Ali <> Date: Tue, 6 Oct 2020 17:19:44 +0100 Subject: [PATCH 12/14] Update xcode --- build-system/xcode_version | 2 +- buildbox/build-telegram.sh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/build-system/xcode_version b/build-system/xcode_version index 8204473ef6..b700dc1d47 100644 --- a/build-system/xcode_version +++ b/build-system/xcode_version @@ -1 +1 @@ -11.5 +12.0.1 diff --git a/buildbox/build-telegram.sh b/buildbox/build-telegram.sh index c5afe51b13..d7acc5af35 100644 --- a/buildbox/build-telegram.sh +++ b/buildbox/build-telegram.sh @@ -5,7 +5,7 @@ set -e BUILD_TELEGRAM_VERSION="1" MACOS_VERSION="10.15" -XCODE_VERSION="11.5" +XCODE_VERSION="12.0.1" GUEST_SHELL="bash" VM_BASE_NAME="macos$(echo $MACOS_VERSION | sed -e 's/\.'/_/g)_Xcode$(echo $XCODE_VERSION | sed -e 's/\.'/_/g)" From b1d2eda2460171a89c508594f5b3f8a2761df2ee Mon Sep 17 00:00:00 2001 From: Ali <> Date: Tue, 6 Oct 2020 17:59:46 +0100 Subject: [PATCH 13/14] [WIP] --- ...hannelDiscussionGroupSetupController.swift | 18 ++++--- .../Sources/SearchPeerMembers.swift | 48 ++++++++++++------- submodules/TelegramApi/Sources/Api0.swift | 2 +- submodules/TelegramApi/Sources/Api1.swift | 28 +++++++---- .../TelegramCore/Sources/ChannelMembers.swift | 19 ++++++++ .../Sources/ChatSearchInputPanelNode.swift | 3 -- .../ChannelMemberCategoryListContext.swift | 13 ++++- ...annelMemberCategoriesContextsManager.swift | 6 +++ 8 files changed, 100 insertions(+), 37 deletions(-) diff --git a/submodules/PeerInfoUI/Sources/ChannelDiscussionGroupSetupController.swift b/submodules/PeerInfoUI/Sources/ChannelDiscussionGroupSetupController.swift index 3e8231b162..7ffe6a614b 100644 --- a/submodules/PeerInfoUI/Sources/ChannelDiscussionGroupSetupController.swift +++ b/submodules/PeerInfoUI/Sources/ChannelDiscussionGroupSetupController.swift @@ -560,9 +560,15 @@ public func channelDiscussionGroupSetupController(context: AccountContext, peerI var isEmptyState = false var displayGroupList = false if let cachedData = view.cachedData as? CachedChannelData { - let isEmpty = cachedData.linkedDiscussionPeerId == nil + var isEmpty = true + switch cachedData.linkedDiscussionPeerId { + case .unknown: + isEmpty = true + case let .known(value): + isEmpty = value == nil + } if let peer = view.peers[view.peerId] as? TelegramChannel, case .broadcast = peer.info { - if cachedData.linkedDiscussionPeerId == nil { + if isEmpty { if groups == nil { isEmptyState = true } else { @@ -570,13 +576,13 @@ public func channelDiscussionGroupSetupController(context: AccountContext, peerI } } } - if let wasEmpty = wasEmpty, wasEmpty != isEmpty { - crossfade = true - } - wasEmpty = isEmpty } else { isEmptyState = true } + if let wasEmpty = wasEmpty, wasEmpty != isEmptyState { + crossfade = true + } + wasEmpty = isEmptyState var emptyStateItem: ItemListControllerEmptyStateItem? if isEmptyState { diff --git a/submodules/SearchPeerMembers/Sources/SearchPeerMembers.swift b/submodules/SearchPeerMembers/Sources/SearchPeerMembers.swift index df45680f8d..05c001fd06 100644 --- a/submodules/SearchPeerMembers/Sources/SearchPeerMembers.swift +++ b/submodules/SearchPeerMembers/Sources/SearchPeerMembers.swift @@ -11,14 +11,12 @@ public enum SearchPeerMembersScope { } public func searchPeerMembers(context: AccountContext, peerId: PeerId, chatLocation: ChatLocation, query: String, scope: SearchPeerMembersScope) -> Signal<[Peer], NoError> { - if case .replyThread = chatLocation { - return .single([]) - } else if peerId.namespace == Namespaces.Peer.CloudChannel { + if peerId.namespace == Namespaces.Peer.CloudChannel { return context.account.postbox.transaction { transaction -> CachedChannelData? in return transaction.getPeerCachedData(peerId: peerId) as? CachedChannelData } |> mapToSignal { cachedData -> Signal<([Peer], Bool), NoError> in - if let cachedData = cachedData, let memberCount = cachedData.participantsSummary.memberCount, memberCount <= 64 { + if case .peer = chatLocation, let cachedData = cachedData, let memberCount = cachedData.participantsSummary.memberCount, memberCount <= 64 { return Signal { subscriber in let (disposable, _) = context.peerChannelMemberCategoriesContextsManager.recent(postbox: context.account.postbox, network: context.account.network, accountPeerId: context.account.peerId, peerId: peerId, searchQuery: nil, requestUpdate: false, updated: { state in if case .ready = state.loadingState { @@ -54,19 +52,37 @@ public func searchPeerMembers(context: AccountContext, peerId: PeerId, chatLocat } return Signal { subscriber in - let (disposable, _) = context.peerChannelMemberCategoriesContextsManager.recent(postbox: context.account.postbox, network: context.account.network, accountPeerId: context.account.peerId, peerId: peerId, searchQuery: query.isEmpty ? nil : query, updated: { state in - if case .ready = state.loadingState { - subscriber.putNext((state.list.compactMap { participant in - if participant.peer.isDeleted { - return nil - } - return participant.peer - }, true)) + switch chatLocation { + case let .peer(peerId): + let (disposable, _) = context.peerChannelMemberCategoriesContextsManager.recent(postbox: context.account.postbox, network: context.account.network, accountPeerId: context.account.peerId, peerId: peerId, searchQuery: query.isEmpty ? nil : query, updated: { state in + if case .ready = state.loadingState { + subscriber.putNext((state.list.compactMap { participant in + if participant.peer.isDeleted { + return nil + } + return participant.peer + }, true)) + } + }) + + return ActionDisposable { + disposable.dispose() + } + case let .replyThread(replyThreadMessage): + let (disposable, _) = context.peerChannelMemberCategoriesContextsManager.mentions(postbox: context.account.postbox, network: context.account.network, accountPeerId: context.account.peerId, peerId: peerId, threadMessageId: replyThreadMessage.messageId, searchQuery: query.isEmpty ? nil : query, updated: { state in + if case .ready = state.loadingState { + subscriber.putNext((state.list.compactMap { participant in + if participant.peer.isDeleted { + return nil + } + return participant.peer + }, true)) + } + }) + + return ActionDisposable { + disposable.dispose() } - }) - - return ActionDisposable { - disposable.dispose() } } |> runOn(Queue.mainQueue()) } diff --git a/submodules/TelegramApi/Sources/Api0.swift b/submodules/TelegramApi/Sources/Api0.swift index dd824ff79f..874ebaa025 100644 --- a/submodules/TelegramApi/Sources/Api0.swift +++ b/submodules/TelegramApi/Sources/Api0.swift @@ -322,7 +322,7 @@ fileprivate let parsers: [Int32 : (BufferReader) -> Any?] = { dict[106343499] = { return Api.ChannelParticipantsFilter.parse_channelParticipantsSearch($0) } dict[-1548400251] = { return Api.ChannelParticipantsFilter.parse_channelParticipantsKicked($0) } dict[-1150621555] = { return Api.ChannelParticipantsFilter.parse_channelParticipantsContacts($0) } - dict[915357814] = { return Api.ChannelParticipantsFilter.parse_channelParticipantsMentions($0) } + dict[-531931925] = { return Api.ChannelParticipantsFilter.parse_channelParticipantsMentions($0) } dict[-350980120] = { return Api.WebPage.parse_webPageEmpty($0) } dict[-981018084] = { return Api.WebPage.parse_webPagePending($0) } dict[-392411726] = { return Api.WebPage.parse_webPage($0) } diff --git a/submodules/TelegramApi/Sources/Api1.swift b/submodules/TelegramApi/Sources/Api1.swift index 8e35f0b9c5..1dd38eed77 100644 --- a/submodules/TelegramApi/Sources/Api1.swift +++ b/submodules/TelegramApi/Sources/Api1.swift @@ -9991,7 +9991,7 @@ public extension Api { case channelParticipantsSearch(q: String) case channelParticipantsKicked(q: String) case channelParticipantsContacts(q: String) - case channelParticipantsMentions(q: String) + case channelParticipantsMentions(flags: Int32, q: String?, topMsgId: Int32?) public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { @@ -10037,11 +10037,13 @@ public extension Api { } serializeString(q, buffer: buffer, boxed: false) break - case .channelParticipantsMentions(let q): + case .channelParticipantsMentions(let flags, let q, let topMsgId): if boxed { - buffer.appendInt32(915357814) + buffer.appendInt32(-531931925) } - serializeString(q, buffer: buffer, boxed: false) + serializeInt32(flags, buffer: buffer, boxed: false) + if Int(flags) & Int(1 << 0) != 0 {serializeString(q!, buffer: buffer, boxed: false)} + if Int(flags) & Int(1 << 1) != 0 {serializeInt32(topMsgId!, buffer: buffer, boxed: false)} break } } @@ -10062,8 +10064,8 @@ public extension Api { return ("channelParticipantsKicked", [("q", q)]) case .channelParticipantsContacts(let q): return ("channelParticipantsContacts", [("q", q)]) - case .channelParticipantsMentions(let q): - return ("channelParticipantsMentions", [("q", q)]) + case .channelParticipantsMentions(let flags, let q, let topMsgId): + return ("channelParticipantsMentions", [("flags", flags), ("q", q), ("topMsgId", topMsgId)]) } } @@ -10121,11 +10123,17 @@ public extension Api { } } public static func parse_channelParticipantsMentions(_ reader: BufferReader) -> ChannelParticipantsFilter? { - var _1: String? - _1 = parseString(reader) + var _1: Int32? + _1 = reader.readInt32() + var _2: String? + if Int(_1!) & Int(1 << 0) != 0 {_2 = parseString(reader) } + var _3: Int32? + if Int(_1!) & Int(1 << 1) != 0 {_3 = reader.readInt32() } let _c1 = _1 != nil - if _c1 { - return Api.ChannelParticipantsFilter.channelParticipantsMentions(q: _1!) + let _c2 = (Int(_1!) & Int(1 << 0) == 0) || _2 != nil + let _c3 = (Int(_1!) & Int(1 << 1) == 0) || _3 != nil + if _c1 && _c2 && _c3 { + return Api.ChannelParticipantsFilter.channelParticipantsMentions(flags: _1!, q: _2, topMsgId: _3) } else { return nil diff --git a/submodules/TelegramCore/Sources/ChannelMembers.swift b/submodules/TelegramCore/Sources/ChannelMembers.swift index e2bcdf9e5f..2fe9cbed67 100644 --- a/submodules/TelegramCore/Sources/ChannelMembers.swift +++ b/submodules/TelegramCore/Sources/ChannelMembers.swift @@ -18,6 +18,7 @@ public enum ChannelMembersCategory { case bots(ChannelMembersCategoryFilter) case restricted(ChannelMembersCategoryFilter) case banned(ChannelMembersCategoryFilter) + case mentions(threadId: MessageId?, filter: ChannelMembersCategoryFilter) } public func channelMembers(postbox: Postbox, network: Network, accountPeerId: PeerId, peerId: PeerId, category: ChannelMembersCategory = .recent(.all), offset: Int32 = 0, limit: Int32 = 64, hash: Int32 = 0) -> Signal<[RenderedChannelParticipant]?, NoError> { @@ -32,6 +33,24 @@ public func channelMembers(postbox: Postbox, network: Network, accountPeerId: Pe case let .search(query): apiFilter = .channelParticipantsSearch(q: query) } + case let .mentions(threadId, filter): + switch filter { + case .all: + var flags: Int32 = 0 + if threadId != nil { + flags |= 1 << 1 + } + apiFilter = .channelParticipantsMentions(flags: flags, q: nil, topMsgId: threadId?.id) + case let .search(query): + var flags: Int32 = 0 + if threadId != nil { + flags |= 1 << 1 + } + if !query.isEmpty { + flags |= 1 << 0 + } + apiFilter = .channelParticipantsMentions(flags: flags, q: query.isEmpty ? nil : query, topMsgId: threadId?.id) + } case .admins: apiFilter = .channelParticipantsAdmins case let .contacts(filter): diff --git a/submodules/TelegramUI/Sources/ChatSearchInputPanelNode.swift b/submodules/TelegramUI/Sources/ChatSearchInputPanelNode.swift index 0f88c5822b..8cbe14652a 100644 --- a/submodules/TelegramUI/Sources/ChatSearchInputPanelNode.swift +++ b/submodules/TelegramUI/Sources/ChatSearchInputPanelNode.swift @@ -189,9 +189,6 @@ final class ChatSearchInputPanelNode: ChatInputPanelNode { canSearchMembers = false } } - if case .replyThread = interfaceState.chatLocation { - canSearchMembers = false - } self.membersButton.isHidden = (!(interfaceState.search?.query.isEmpty ?? true)) || self.displayActivity || !canSearchMembers let resultsEnabled = (resultCount ?? 0) > 0 diff --git a/submodules/TemporaryCachedPeerDataManager/Sources/ChannelMemberCategoryListContext.swift b/submodules/TemporaryCachedPeerDataManager/Sources/ChannelMemberCategoryListContext.swift index 21045ada0f..0b20956993 100644 --- a/submodules/TemporaryCachedPeerDataManager/Sources/ChannelMemberCategoryListContext.swift +++ b/submodules/TemporaryCachedPeerDataManager/Sources/ChannelMemberCategoryListContext.swift @@ -64,6 +64,7 @@ public struct ChannelMemberListState { enum ChannelMemberListCategory { case recent case recentSearch(String) + case mentions(MessageId?, String?) case admins(String?) case contacts(String?) case bots(String?) @@ -211,6 +212,12 @@ private final class ChannelMemberSingleCategoryListContext: ChannelMemberCategor requestCategory = .recent(.all) case let .recentSearch(query): requestCategory = .recent(.search(query)) + case let .mentions(threadId, query): + if let query = query, !query.isEmpty { + requestCategory = .mentions(threadId: threadId, filter: .search(query)) + } else { + requestCategory = .mentions(threadId: threadId, filter: .all) + } case let .admins(query): requestCategory = .admins adminQuery = query @@ -521,6 +528,8 @@ private final class ChannelMemberSingleCategoryListContext: ChannelMemberCategor } } } + case .mentions: + break } } if updatedList { @@ -728,7 +737,7 @@ final class PeerChannelMemberCategoriesContext { emptyTimeout = 0.0 } switch key { - case .recent, .recentSearch, .admins, .contacts, .bots: + case .recent, .recentSearch, .admins, .contacts, .bots, .mentions: let mappedCategory: ChannelMemberListCategory switch key { case .recent: @@ -741,6 +750,8 @@ final class PeerChannelMemberCategoriesContext { mappedCategory = .contacts(query) case let .bots(query): mappedCategory = .bots(query) + case let .mentions(threadId, query): + mappedCategory = .mentions(threadId, query) default: mappedCategory = .recent } diff --git a/submodules/TemporaryCachedPeerDataManager/Sources/PeerChannelMemberCategoriesContextsManager.swift b/submodules/TemporaryCachedPeerDataManager/Sources/PeerChannelMemberCategoriesContextsManager.swift index b5e386a3a8..a2329de73c 100644 --- a/submodules/TemporaryCachedPeerDataManager/Sources/PeerChannelMemberCategoriesContextsManager.swift +++ b/submodules/TemporaryCachedPeerDataManager/Sources/PeerChannelMemberCategoriesContextsManager.swift @@ -8,6 +8,7 @@ import TelegramStringFormatting enum PeerChannelMemberContextKey: Equatable, Hashable { case recent case recentSearch(String) + case mentions(threadId: MessageId?, query: String?) case admins(String?) case contacts(String?) case bots(String?) @@ -321,6 +322,11 @@ public final class PeerChannelMemberCategoriesContextsManager { return self.getContext(postbox: postbox, network: network, accountPeerId: accountPeerId, peerId: peerId, key: key, requestUpdate: requestUpdate, updated: updated) } + public func mentions(postbox: Postbox, network: Network, accountPeerId: PeerId, peerId: PeerId, threadMessageId: MessageId?, searchQuery: String? = nil, requestUpdate: Bool = true, updated: @escaping (ChannelMemberListState) -> Void) -> (Disposable, PeerChannelMemberCategoryControl?) { + let key: PeerChannelMemberContextKey = .mentions(threadId: threadMessageId, query: searchQuery) + return self.getContext(postbox: postbox, network: network, accountPeerId: accountPeerId, peerId: peerId, key: key, requestUpdate: requestUpdate, updated: updated) + } + public func admins(postbox: Postbox, network: Network, accountPeerId: PeerId, peerId: PeerId, searchQuery: String? = nil, updated: @escaping (ChannelMemberListState) -> Void) -> (Disposable, PeerChannelMemberCategoryControl?) { return self.getContext(postbox: postbox, network: network, accountPeerId: accountPeerId, peerId: peerId, key: .admins(searchQuery), requestUpdate: true, updated: updated) } From 4f466f0f6935f47fa30e9be14db11c862c83e788 Mon Sep 17 00:00:00 2001 From: Ali <> Date: Tue, 6 Oct 2020 19:12:45 +0100 Subject: [PATCH 14/14] Restore regular pin behavior --- submodules/TelegramUI/Sources/ChatController.swift | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/submodules/TelegramUI/Sources/ChatController.swift b/submodules/TelegramUI/Sources/ChatController.swift index f912a5fbc9..d0ea5b689a 100644 --- a/submodules/TelegramUI/Sources/ChatController.swift +++ b/submodules/TelegramUI/Sources/ChatController.swift @@ -3492,8 +3492,13 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G } } } else { - pinnedMessageId = topPinnedMessage?.message.id - pinnedMessage = topPinnedMessage + if let pinnedMessageId = pinnedMessageId { + if let message = messages?[pinnedMessageId] { + pinnedMessage = ChatPinnedMessage(message: message, isLatest: true) + } + } + //pinnedMessageId = topPinnedMessage?.message.id + //pinnedMessage = topPinnedMessage } var pinnedMessageUpdated = false