From 3a0d33ef7defcce201ffee3971b270afb01da0f6 Mon Sep 17 00:00:00 2001 From: Ilya Laktyushin Date: Tue, 27 Nov 2018 21:28:38 +0400 Subject: [PATCH] Instant View: reference view, scroll position saving, overlay progresses for photos and more --- TelegramUI.xcodeproj/project.pbxproj | 16 + TelegramUI/ChatBotInfoItem.swift | 2 +- TelegramUI/ChatController.swift | 78 +- TelegramUI/ChatControllerNode.swift | 4 +- TelegramUI/ChatEmptyNode.swift | 22 +- TelegramUI/ChatHistoryEntriesForView.swift | 2 +- TelegramUI/ChatHistoryEntry.swift | 10 +- TelegramUI/ChatHistoryListNode.swift | 8 +- TelegramUI/ChatHoleItem.swift | 17 +- TelegramUI/ChatListController.swift | 12 +- TelegramUI/ChatLoadingNode.swift | 10 +- TelegramUI/ChatMessageActionItemNode.swift | 21 +- TelegramUI/ChatMessageBubbleItemNode.swift | 8 +- TelegramUI/ChatMessageDateAndStatusNode.swift | 8 +- TelegramUI/ChatMessageDateHeader.swift | 4 +- TelegramUI/ChatMessageForwardInfoNode.swift | 7 +- .../ChatMessageInstantVideoItemNode.swift | 11 +- .../ChatMessageInteractiveFileNode.swift | 2 +- ...atMessageInteractiveInstantVideoNode.swift | 5 +- TelegramUI/ChatMessageReplyInfoNode.swift | 17 +- TelegramUI/ChatMessageStickerItemNode.swift | 6 +- .../ChatMessageWebpageBubbleContentNode.swift | 17 + TelegramUI/ChatPresentationData.swift | 8 + .../ChatRecentActionsControllerNode.swift | 4 +- TelegramUI/ChatRecentActionsEmptyNode.swift | 14 +- TelegramUI/ContactListNode.swift | 25 +- TelegramUI/ContactsController.swift | 3 +- TelegramUI/DeclareEncodables.swift | 2 + .../DefaultDarkAccentPresentationTheme.swift | 6 +- TelegramUI/DefaultDarkPresentationTheme.swift | 6 +- TelegramUI/DefaultPresentationTheme.swift | 12 +- TelegramUI/GenerateTextEntities.swift | 15 +- TelegramUI/HashtagSearchController.swift | 3 + TelegramUI/HashtagSearchControllerNode.swift | 2 +- TelegramUI/InstantImageGalleryItem.swift | 2 +- TelegramUI/InstantPageContentNode.swift | 434 ++ TelegramUI/InstantPageController.swift | 11 +- TelegramUI/InstantPageControllerNode.swift | 138 +- TelegramUI/InstantPageDetailsNode.swift | 430 +- TelegramUI/InstantPageImageNode.swift | 49 +- TelegramUI/InstantPagePeerReferenceItem.swift | 2 +- TelegramUI/InstantPagePeerReferenceNode.swift | 25 +- .../InstantPageReferenceController.swift | 14 +- .../InstantPageReferenceControllerNode.swift | 301 +- TelegramUI/InstantPageStoredState.swift | 75 + TelegramUI/InstantPageTextItem.swift | 4 +- TelegramUI/InstantPageTheme.swift | 39 +- TelegramUI/ItemCacheKeys.swift | 11 + TelegramUI/NavigateToChatController.swift | 9 +- TelegramUI/Notices.swift | 28 + TelegramUI/NotificationsAndSounds.swift | 20 +- TelegramUI/PeerReportController.swift | 5 +- TelegramUI/PermissionContentNode.swift | 96 + TelegramUI/PermissionController.swift | 99 +- TelegramUI/PermissionControllerNode.swift | 350 +- TelegramUI/PresentationResourceKey.swift | 6 - TelegramUI/PresentationResourcesChat.swift | 41 +- TelegramUI/PresentationStrings.swift | 4622 +++++++++-------- TelegramUI/PresentationTheme.swift | 56 +- .../PresentationThemeEssentialGraphics.swift | 37 +- .../Resources/PresentationStrings.mapping | Bin 89407 -> 90241 bytes TelegramUI/SettingsController.swift | 3 +- .../SetupTwoStepVerificationContentNode.swift | 1 - ...tupTwoStepVerificationControllerNode.swift | 2 +- TelegramUI/SolidRoundedButtonNode.swift | 8 +- TelegramUI/TelegramRootController.swift | 26 - 66 files changed, 4032 insertions(+), 3299 deletions(-) create mode 100644 TelegramUI/InstantPageContentNode.swift create mode 100644 TelegramUI/InstantPageStoredState.swift create mode 100644 TelegramUI/ItemCacheKeys.swift create mode 100644 TelegramUI/PermissionContentNode.swift diff --git a/TelegramUI.xcodeproj/project.pbxproj b/TelegramUI.xcodeproj/project.pbxproj index ac035721cd..b214489b1d 100644 --- a/TelegramUI.xcodeproj/project.pbxproj +++ b/TelegramUI.xcodeproj/project.pbxproj @@ -63,6 +63,10 @@ 09B4EE4F21A7B75D00847FA6 /* PermissionControllerNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09B4EE4E21A7B75D00847FA6 /* PermissionControllerNode.swift */; }; 09B4EE5221A7CC3E00847FA6 /* SolidRoundedButtonNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09B4EE5121A7CC3E00847FA6 /* SolidRoundedButtonNode.swift */; }; 09B4EE5621A8149C00847FA6 /* NotificationPermissionInfoItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09B4EE5521A8149C00847FA6 /* NotificationPermissionInfoItem.swift */; }; + 09B4EE5E21AC626B00847FA6 /* PermissionContentNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09B4EE5D21AC626B00847FA6 /* PermissionContentNode.swift */; }; + 09B4EE6021AD4A0E00847FA6 /* InstantPageContentNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09B4EE5F21AD4A0E00847FA6 /* InstantPageContentNode.swift */; }; + 09B4EE6221AD791600847FA6 /* InstantPageStoredState.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09B4EE6121AD791600847FA6 /* InstantPageStoredState.swift */; }; + 09B4EE6421AD7B3E00847FA6 /* ItemCacheKeys.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09B4EE6321AD7B3E00847FA6 /* ItemCacheKeys.swift */; }; 09C3466D2167D63A00B76780 /* Accessibility.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09C3466C2167D63A00B76780 /* Accessibility.swift */; }; 09C500242142BA6400EF253E /* ItemListWebsiteItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09C500232142BA6400EF253E /* ItemListWebsiteItem.swift */; }; 09C9EA33219F79F600E90146 /* ID3Artwork.m in Sources */ = {isa = PBXBuildFile; fileRef = 09C9EA31219F79F500E90146 /* ID3Artwork.m */; }; @@ -1134,6 +1138,10 @@ 09B4EE4E21A7B75D00847FA6 /* PermissionControllerNode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PermissionControllerNode.swift; sourceTree = ""; }; 09B4EE5121A7CC3E00847FA6 /* SolidRoundedButtonNode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SolidRoundedButtonNode.swift; sourceTree = ""; }; 09B4EE5521A8149C00847FA6 /* NotificationPermissionInfoItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationPermissionInfoItem.swift; sourceTree = ""; }; + 09B4EE5D21AC626B00847FA6 /* PermissionContentNode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PermissionContentNode.swift; sourceTree = ""; }; + 09B4EE5F21AD4A0E00847FA6 /* InstantPageContentNode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InstantPageContentNode.swift; sourceTree = ""; }; + 09B4EE6121AD791600847FA6 /* InstantPageStoredState.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InstantPageStoredState.swift; sourceTree = ""; }; + 09B4EE6321AD7B3E00847FA6 /* ItemCacheKeys.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ItemCacheKeys.swift; sourceTree = ""; }; 09C3466C2167D63A00B76780 /* Accessibility.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Accessibility.swift; sourceTree = ""; }; 09C500232142BA6400EF253E /* ItemListWebsiteItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ItemListWebsiteItem.swift; sourceTree = ""; }; 09C9EA31219F79F500E90146 /* ID3Artwork.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ID3Artwork.m; sourceTree = ""; }; @@ -2358,6 +2366,7 @@ children = ( 09B4EE4C21A7B73800847FA6 /* PermissionController.swift */, 09B4EE4E21A7B75D00847FA6 /* PermissionControllerNode.swift */, + 09B4EE5D21AC626B00847FA6 /* PermissionContentNode.swift */, 09B4EE5121A7CC3E00847FA6 /* SolidRoundedButtonNode.swift */, ); name = Permissions; @@ -3113,6 +3122,7 @@ children = ( D0215D371E040F53001A0B1E /* InstantPageNode.swift */, D0215D391E041003001A0B1E /* InstantPageLayout.swift */, + 09B4EE5F21AD4A0E00847FA6 /* InstantPageContentNode.swift */, D0215D3B1E041014001A0B1E /* InstantPageItem.swift */, D0215D3D1E041048001A0B1E /* InstantPageMedia.swift */, D0215D3F1E0410D9001A0B1E /* InstantPageLinkSelectionView.swift */, @@ -3158,6 +3168,7 @@ 09619B8D21A34C0100493558 /* InstantPageScrollableNode.swift */, 09619B9321A4ABF500493558 /* InstantPageReferenceController.swift */, 09619B9421A4ABF600493558 /* InstantPageReferenceControllerNode.swift */, + 09B4EE6121AD791600847FA6 /* InstantPageStoredState.swift */, ); name = "Instant Page"; sourceTree = ""; @@ -4553,6 +4564,7 @@ 0902838C2194AEB90067EFBD /* ImageTransparency.swift */, 09C9EA32219F79F600E90146 /* ID3Artwork.h */, 09C9EA31219F79F500E90146 /* ID3Artwork.m */, + 09B4EE6321AD7B3E00847FA6 /* ItemCacheKeys.swift */, ); name = Utils; sourceTree = ""; @@ -4917,6 +4929,7 @@ D0EC6CB01EB9F58800EBF1C3 /* objects.c in Sources */, D0EC6CB11EB9F58800EBF1C3 /* program.c in Sources */, D0E412DA206A894800BEE4A2 /* SecureIdValueFormFileItem.swift in Sources */, + 09B4EE6221AD791600847FA6 /* InstantPageStoredState.swift in Sources */, D0EC6CB21EB9F58800EBF1C3 /* rngs.c in Sources */, D083491C209361DC008CFD52 /* AvatarGalleryItemFooterContentNode.swift in Sources */, D0EC6CB31EB9F58800EBF1C3 /* shader.c in Sources */, @@ -5002,6 +5015,7 @@ D0EC6CD81EB9F58800EBF1C3 /* ShakeAnimation.swift in Sources */, D0EC6CD91EB9F58800EBF1C3 /* ValidateAddressNameInteractive.swift in Sources */, D0BE30452061C09000FBE6D8 /* SecureIdAuthContentNode.swift in Sources */, + 09B4EE5E21AC626B00847FA6 /* PermissionContentNode.swift in Sources */, D0E412CC206A6B2300BEE4A2 /* FormControllerActionItem.swift in Sources */, D0471B5A1EFE70400074D609 /* BotCheckoutInfoControllerNode.swift in Sources */, D0EC6CDA1EB9F58800EBF1C3 /* NumericFormat.swift in Sources */, @@ -5073,6 +5087,7 @@ 096C98BF21787C6700C211FF /* TGBridgeAudioEncoder.m in Sources */, D01776B81F1D6FB30044446D /* RadialProgressContentNode.swift in Sources */, D05D8B762195CD930064586F /* SetupTwoStepVerificationControllerNode.swift in Sources */, + 09B4EE6421AD7B3E00847FA6 /* ItemCacheKeys.swift in Sources */, D0EC6CFA1EB9F58800EBF1C3 /* ManagedAudioSession.swift in Sources */, D0EB5ADF1F798033004E89B6 /* PeerMediaCollectionEmptyNode.swift in Sources */, D0EC6CFB1EB9F58800EBF1C3 /* ManagedAudioRecorder.swift in Sources */, @@ -5641,6 +5656,7 @@ D0FC194D201F82A000FEDBB2 /* OpenResolvedUrl.swift in Sources */, D0EC6E251EB9F58900EBF1C3 /* StickerPackPreviewGridItem.swift in Sources */, D0EC6E261EB9F58900EBF1C3 /* StickerPreviewController.swift in Sources */, + 09B4EE6021AD4A0E00847FA6 /* InstantPageContentNode.swift in Sources */, D0EC6E271EB9F58900EBF1C3 /* StickerPreviewControllerNode.swift in Sources */, D0EC6E281EB9F58900EBF1C3 /* ContactsController.swift in Sources */, D0EC6E291EB9F58900EBF1C3 /* ContactsControllerNode.swift in Sources */, diff --git a/TelegramUI/ChatBotInfoItem.swift b/TelegramUI/ChatBotInfoItem.swift index 823b334714..8a96f22e5c 100644 --- a/TelegramUI/ChatBotInfoItem.swift +++ b/TelegramUI/ChatBotInfoItem.swift @@ -110,7 +110,7 @@ final class ChatBotInfoItemNode: ListViewItemNode { var updatedBackgroundImage: UIImage? if currentTheme != item.presentationData.theme { - //let principalGraphics = PresentationResourcesChat.principalGraphics(item.presentationData.theme.theme, wallpaper: !item.presentationData.theme.wallpaper.isEmpty) + //let principalGraphics = PresentationResourcesChat.principalGraphics(item.presentationData.theme.theme, wallpaper: item.presentationData.theme.wallpaper) updatedBackgroundImage = PresentationResourcesChat.chatInfoItemBackgroundImage(item.presentationData.theme.theme, wallpaper: !item.presentationData.theme.wallpaper.isEmpty) } diff --git a/TelegramUI/ChatController.swift b/TelegramUI/ChatController.swift index 04f88e3db6..3ef7fd0bb3 100644 --- a/TelegramUI/ChatController.swift +++ b/TelegramUI/ChatController.swift @@ -71,6 +71,8 @@ let ChatControllerCount = Atomic(value: 0) public final class ChatController: TelegramController, KeyShortcutResponder, UIDropInteractionDelegate { private var validLayout: ContainerViewLayout? + weak var parentController: ViewController? + public var peekActions: ChatControllerPeekActions = .standard private var didSetup3dTouch: Bool = false @@ -4335,6 +4337,10 @@ public final class ChatController: TelegramController, KeyShortcutResponder, UID return nil } + func scrollToEndOfHistory() { + self.chatDisplayNode.historyNode.scrollToEndOfHistory() + } + public func navigateToMessage(messageLocation: NavigateToMessageLocation, animated: Bool, completion: (() -> Void)? = nil) { self.navigateToMessage(from: nil, to: messageLocation, rememberInStack: false, animated: animated, completion: completion) } @@ -4508,7 +4514,7 @@ public final class ChatController: TelegramController, KeyShortcutResponder, UID return } - if case .peer(peerId) = strongSelf.chatLocation { + if case .peer(peerId) = strongSelf.chatLocation, strongSelf.parentController == nil { strongSelf.updateChatPresentationInterfaceState(animated: false, interactive: true, { $0.updatedInterfaceState({ $0.withUpdatedForwardMessageIds(messageIds).withoutSelectionState() }) }) strongController.dismiss() } else if peerId == strongSelf.account.peerId { @@ -4566,7 +4572,11 @@ public final class ChatController: TelegramController, KeyShortcutResponder, UID } })) - (strongSelf.navigationController as? NavigationController)?.replaceTopController(ChatController(account: strongSelf.account, chatLocation: .peer(peerId)), animated: false, ready: ready) + if let parentController = strongSelf.parentController { + (parentController.navigationController as? NavigationController)?.replaceTopController(ChatController(account: strongSelf.account, chatLocation: .peer(peerId)), animated: false, ready: ready) + } else { + (strongSelf.navigationController as? NavigationController)?.replaceTopController(ChatController(account: strongSelf.account, chatLocation: .peer(peerId)), animated: false, ready: ready) + } } }) } @@ -4765,35 +4775,43 @@ public final class ChatController: TelegramController, KeyShortcutResponder, UID private func reportPeer() { if let peer = self.presentationInterfaceState.renderedPeer?.peer { - let title: String - var infoString: String? - if let _ = peer as? TelegramGroup { - title = self.presentationData.strings.Conversation_ReportSpam - } else if let _ = peer as? TelegramChannel { - title = self.presentationData.strings.Conversation_ReportSpam - } else { - title = self.presentationData.strings.Conversation_ReportSpam - infoString = self.presentationData.strings.Conversation_ReportSpamConfirmation - } - let actionSheet = ActionSheetController(presentationTheme: self.presentationData.theme) - - var items: [ActionSheetItem] = [] - if let infoString = infoString { - items.append(ActionSheetTextItem(title: infoString)) - } - items.append(ActionSheetButtonItem(title: title, color: .destructive, action: { [weak self, weak actionSheet] in - actionSheet?.dismissAnimated() - if let strongSelf = self { - strongSelf.deleteChat(reportChatSpam: true) - } - })) - actionSheet.setItemGroups([ActionSheetItemGroup(items: items), ActionSheetItemGroup(items: [ - ActionSheetButtonItem(title: self.presentationData.strings.Common_Cancel, color: .accent, action: { [weak actionSheet] in - actionSheet?.dismissAnimated() - }) - ])]) self.chatDisplayNode.dismissInput() - self.present(actionSheet, in: .window(.root)) + + if let peer = peer as? TelegramChannel, let username = peer.username, !username.isEmpty { + self.present(peerReportOptionsController(account: account, subject: .peer(peer.id), present: { [weak self] c, a in + self?.present(c, in: .window(.root)) + }), in: .window(.root)) + } else { + let title: String + var infoString: String? + if let _ = peer as? TelegramGroup { + title = self.presentationData.strings.Conversation_ReportSpam + } else if let _ = peer as? TelegramChannel { + title = self.presentationData.strings.Conversation_ReportSpam + } else { + title = self.presentationData.strings.Conversation_ReportSpam + infoString = self.presentationData.strings.Conversation_ReportSpamConfirmation + } + let actionSheet = ActionSheetController(presentationTheme: self.presentationData.theme) + + var items: [ActionSheetItem] = [] + if let infoString = infoString { + items.append(ActionSheetTextItem(title: infoString)) + } + items.append(ActionSheetButtonItem(title: title, color: .destructive, action: { [weak self, weak actionSheet] in + actionSheet?.dismissAnimated() + if let strongSelf = self { + strongSelf.deleteChat(reportChatSpam: true) + } + })) + actionSheet.setItemGroups([ActionSheetItemGroup(items: items), ActionSheetItemGroup(items: [ + ActionSheetButtonItem(title: self.presentationData.strings.Common_Cancel, color: .accent, action: { [weak actionSheet] in + actionSheet?.dismissAnimated() + }) + ])]) + + self.present(actionSheet, in: .window(.root)) + } } } diff --git a/TelegramUI/ChatControllerNode.swift b/TelegramUI/ChatControllerNode.swift index dd2a72029c..56ec52d5df 100644 --- a/TelegramUI/ChatControllerNode.swift +++ b/TelegramUI/ChatControllerNode.swift @@ -189,7 +189,7 @@ class ChatControllerNode: ASDisplayNode, UIScrollViewDelegate { self.historyNode = ChatHistoryListNode(account: account, chatLocation: chatLocation, tagMask: nil, messageId: messageId, controllerInteraction: controllerInteraction, selectedMessages: self.selectedMessagesPromise.get()) self.historyNodeContainer = ASDisplayNode() self.historyNodeContainer.addSubnode(self.historyNode) - self.loadingNode = ChatLoadingNode(theme: chatPresentationInterfaceState.theme) + self.loadingNode = ChatLoadingNode(theme: self.chatPresentationInterfaceState.theme, chatWallpaper: self.chatPresentationInterfaceState.chatWallpaper) self.inputPanelBackgroundNode = ASDisplayNode() self.inputPanelBackgroundNode.backgroundColor = self.chatPresentationInterfaceState.theme.chat.inputPanel.panelBackgroundColor @@ -1323,7 +1323,7 @@ class ChatControllerNode: ASDisplayNode, UIScrollViewDelegate { if let restrictionText = restrictionText { if self.restrictedNode == nil { - let restrictedNode = ChatRecentActionsEmptyNode(theme: chatPresentationInterfaceState.theme) + let restrictedNode = ChatRecentActionsEmptyNode(theme: chatPresentationInterfaceState.theme, chatWallpaper: chatPresentationInterfaceState.chatWallpaper) self.historyNodeContainer.supernode?.insertSubnode(restrictedNode, aboveSubnode: self.historyNodeContainer) self.restrictedNode = restrictedNode } diff --git a/TelegramUI/ChatEmptyNode.swift b/TelegramUI/ChatEmptyNode.swift index 404cc13e31..d29e54943d 100644 --- a/TelegramUI/ChatEmptyNode.swift +++ b/TelegramUI/ChatEmptyNode.swift @@ -30,7 +30,8 @@ private final class ChatEmptyNodeRegularChatContent: ASDisplayNode, ChatEmptyNod self.currentTheme = interfaceState.theme self.currentStrings = interfaceState.strings - self.textNode.attributedText = NSAttributedString(string: interfaceState.strings.Conversation_EmptyPlaceholder, font: messageFont, textColor: interfaceState.theme.chat.serviceMessage.serviceMessagePrimaryTextColor) + let serviceColor = serviceMessageColorComponents(theme: interfaceState.theme, wallpaper: interfaceState.chatWallpaper) + self.textNode.attributedText = NSAttributedString(string: interfaceState.strings.Conversation_EmptyPlaceholder, font: messageFont, textColor: serviceColor.primaryText) } let insets = UIEdgeInsets(top: 6.0, left: 10.0, bottom: 6.0, right: 10.0) @@ -100,9 +101,11 @@ private final class ChatEmptyNodeSecretChatContent: ASDisplayNode, ChatEmptyNode titleString = interfaceState.strings.Conversation_EncryptedPlaceholderTitleOutgoing(title).0 } - self.titleNode.attributedText = NSAttributedString(string: titleString, font: titleFont, textColor: interfaceState.theme.chat.serviceMessage.serviceMessagePrimaryTextColor) + let serviceColor = serviceMessageColorComponents(theme: interfaceState.theme, wallpaper: interfaceState.chatWallpaper) - self.subtitleNode.attributedText = NSAttributedString(string: interfaceState.strings.Conversation_EncryptedDescriptionTitle, font: messageFont, textColor: interfaceState.theme.chat.serviceMessage.serviceMessagePrimaryTextColor) + self.titleNode.attributedText = NSAttributedString(string: titleString, font: titleFont, textColor: serviceColor.primaryText) + + self.subtitleNode.attributedText = NSAttributedString(string: interfaceState.strings.Conversation_EncryptedDescriptionTitle, font: messageFont, textColor: serviceColor.primaryText) let strings: [String] = [ interfaceState.strings.Conversation_EncryptedDescription1, @@ -111,7 +114,7 @@ private final class ChatEmptyNodeSecretChatContent: ASDisplayNode, ChatEmptyNode interfaceState.strings.Conversation_EncryptedDescription4 ] - let lines: [NSAttributedString] = strings.map { NSAttributedString(string: $0, font: messageFont, textColor: interfaceState.theme.chat.serviceMessage.serviceMessagePrimaryTextColor) } + let lines: [NSAttributedString] = strings.map { NSAttributedString(string: $0, font: messageFont, textColor: serviceColor.primaryText) } let lockIcon = PresentationResourcesChat.chatEmptyItemLockIcon(interfaceState.theme) @@ -210,10 +213,12 @@ private final class ChatEmptyNodeCloudChatContent: ASDisplayNode, ChatEmptyNodeC self.currentTheme = interfaceState.theme self.currentStrings = interfaceState.strings - self.iconNode.image = generateTintedImage(image: UIImage(bundleImageName: "Chat/Empty Chat/Cloud"), color: interfaceState.theme.chat.serviceMessage.serviceMessagePrimaryTextColor) + let serviceColor = serviceMessageColorComponents(theme: interfaceState.theme, wallpaper: interfaceState.chatWallpaper) + + self.iconNode.image = generateTintedImage(image: UIImage(bundleImageName: "Chat/Empty Chat/Cloud"), color: serviceColor.primaryText) let titleString = interfaceState.strings.Conversation_CloudStorageInfo_Title - self.titleNode.attributedText = NSAttributedString(string: titleString, font: titleFont, textColor: interfaceState.theme.chat.serviceMessage.serviceMessagePrimaryTextColor) + self.titleNode.attributedText = NSAttributedString(string: titleString, font: titleFont, textColor: serviceColor.primaryText) let strings: [String] = [ interfaceState.strings.Conversation_ClousStorageInfo_Description1, @@ -222,7 +227,7 @@ private final class ChatEmptyNodeCloudChatContent: ASDisplayNode, ChatEmptyNodeC interfaceState.strings.Conversation_ClousStorageInfo_Description4 ] - let lines: [NSAttributedString] = strings.map { NSAttributedString(string: $0, font: messageFont, textColor: interfaceState.theme.chat.serviceMessage.serviceMessagePrimaryTextColor) } + let lines: [NSAttributedString] = strings.map { NSAttributedString(string: $0, font: messageFont, textColor: serviceColor.primaryText) } for i in 0 ..< lines.count { if i >= self.lineNodes.count { @@ -324,7 +329,8 @@ final class ChatEmptyNode: ASDisplayNode { self.currentTheme = interfaceState.theme self.currentStrings = interfaceState.strings - self.backgroundNode.image = PresentationResourcesChat.chatEmptyItemBackgroundImage(interfaceState.theme) + let graphics = PresentationResourcesChat.principalGraphics(interfaceState.theme, wallpaper: interfaceState.chatWallpaper) + self.backgroundNode.image = graphics.chatEmptyItemBackgroundImage } let contentType: ChatEmptyNodeContentType diff --git a/TelegramUI/ChatHistoryEntriesForView.swift b/TelegramUI/ChatHistoryEntriesForView.swift index 0cc1d8694e..edf855367e 100644 --- a/TelegramUI/ChatHistoryEntriesForView.swift +++ b/TelegramUI/ChatHistoryEntriesForView.swift @@ -25,7 +25,7 @@ func chatHistoryEntriesForView(location: ChatLocation, view: MessageHistoryView, groupBucket.removeAll() } if view.tagMask == nil { - entries.append(.HoleEntry(hole, presentationData.theme.theme, presentationData.strings)) + entries.append(.HoleEntry(hole, presentationData)) } case let .MessageEntry(message, read, _, monthLocation): var isAdmin = false diff --git a/TelegramUI/ChatHistoryEntry.swift b/TelegramUI/ChatHistoryEntry.swift index 095c0f94ad..7703dd722c 100644 --- a/TelegramUI/ChatHistoryEntry.swift +++ b/TelegramUI/ChatHistoryEntry.swift @@ -24,7 +24,7 @@ public enum ChatHistoryMessageSelection: Equatable { } enum ChatHistoryEntry: Identifiable, Comparable { - case HoleEntry(MessageHistoryHole, PresentationTheme, PresentationStrings) + case HoleEntry(MessageHistoryHole, ChatPresentationData) case MessageEntry(Message, ChatPresentationData, Bool, MessageHistoryEntryMonthLocation?, ChatHistoryMessageSelection, Bool) case MessageGroupEntry(MessageGroupInfo, [(Message, Bool, ChatHistoryMessageSelection, Bool)], ChatPresentationData) case UnreadEntry(MessageIndex, ChatPresentationData) @@ -33,7 +33,7 @@ enum ChatHistoryEntry: Identifiable, Comparable { var stableId: UInt64 { switch self { - case let .HoleEntry(hole, _, _): + case let .HoleEntry(hole, _): return UInt64(hole.stableId) | ((UInt64(1) << 40)) case let .MessageEntry(message, _, _, _, _, _): return UInt64(message.stableId) | ((UInt64(2) << 40)) @@ -50,7 +50,7 @@ enum ChatHistoryEntry: Identifiable, Comparable { var index: MessageIndex { switch self { - case let .HoleEntry(hole, _, _): + case let .HoleEntry(hole, _): return hole.maxIndex case let .MessageEntry(message, _, _, _, _, _): return MessageIndex(message) @@ -67,8 +67,8 @@ enum ChatHistoryEntry: Identifiable, Comparable { static func ==(lhs: ChatHistoryEntry, rhs: ChatHistoryEntry) -> Bool { switch lhs { - case let .HoleEntry(lhsHole, lhsTheme, lhsStrings): - if case let .HoleEntry(rhsHole, rhsTheme, rhsStrings) = rhs, lhsHole == rhsHole, lhsTheme === rhsTheme, lhsStrings === rhsStrings { + case let .HoleEntry(lhsHole, lhsPresentationData): + if case let .HoleEntry(rhsHole, rhsPresentationData) = rhs, lhsHole == rhsHole, lhsPresentationData === rhsPresentationData { return true } else { return false diff --git a/TelegramUI/ChatHistoryListNode.swift b/TelegramUI/ChatHistoryListNode.swift index a583c0da52..dbc70c2173 100644 --- a/TelegramUI/ChatHistoryListNode.swift +++ b/TelegramUI/ChatHistoryListNode.swift @@ -166,11 +166,11 @@ private func mappedInsertEntries(account: Account, chatLocation: ChatLocation, a item = ListMessageItem(theme: presentationData.theme.theme, strings: presentationData.strings, dateTimeFormat: presentationData.dateTimeFormat, account: account, chatLocation: chatLocation, controllerInteraction: controllerInteraction, message: messages[0].0, selection: .none, displayHeader: search) } return ListViewInsertItem(index: entry.index, previousIndex: entry.previousIndex, item: item, directionHint: entry.directionHint) - case let .HoleEntry(_, theme, strings): + case let .HoleEntry(_, presentationData): let item: ListViewItem switch mode { case .bubbles: - item = ChatHoleItem(index: entry.entry.index, theme: theme, strings: strings) + item = ChatHoleItem(index: entry.entry.index, presentationData: presentationData) case .list: item = ListMessageHoleItem() } @@ -209,11 +209,11 @@ private func mappedUpdateEntries(account: Account, chatLocation: ChatLocation, a item = ListMessageItem(theme: presentationData.theme.theme, strings: presentationData.strings, dateTimeFormat: presentationData.dateTimeFormat, account: account, chatLocation: chatLocation, controllerInteraction: controllerInteraction, message: messages[0].0, selection: .none, displayHeader: search) } return ListViewUpdateItem(index: entry.index, previousIndex: entry.previousIndex, item: item, directionHint: entry.directionHint) - case let .HoleEntry(_, theme, strings): + case let .HoleEntry(_, presentationData): let item: ListViewItem switch mode { case .bubbles: - item = ChatHoleItem(index: entry.entry.index, theme: theme, strings: strings) + item = ChatHoleItem(index: entry.entry.index, presentationData: presentationData) case .list: item = ListMessageHoleItem() } diff --git a/TelegramUI/ChatHoleItem.swift b/TelegramUI/ChatHoleItem.swift index 801affe40d..a2b409de6a 100644 --- a/TelegramUI/ChatHoleItem.swift +++ b/TelegramUI/ChatHoleItem.swift @@ -9,14 +9,12 @@ private let titleFont = UIFont.systemFont(ofSize: 13.0) class ChatHoleItem: ListViewItem { let index: MessageIndex - let theme: PresentationTheme - let strings: PresentationStrings + let presentationData: ChatPresentationData //let header: ChatMessageDateHeader - init(index: MessageIndex, theme: PresentationTheme, strings: PresentationStrings) { + init(index: MessageIndex, presentationData: ChatPresentationData) { self.index = index - self.theme = theme - self.strings = strings + self.presentationData = presentationData //self.header = ChatMessageDateHeader(timestamp: index.timestamp, theme: theme, strings: strings) } @@ -81,11 +79,14 @@ class ChatHoleItemNode: ListViewItemNode { let currentItem = self.item return { item, params, dateAtBottom in var updatedBackground: UIImage? - if item.theme !== currentItem?.theme { - updatedBackground = PresentationResourcesChat.chatServiceBubbleFillImage(item.theme) + if item.presentationData.theme !== currentItem?.presentationData.theme { + let graphics = PresentationResourcesChat.principalGraphics(item.presentationData.theme.theme, wallpaper: item.presentationData.theme.wallpaper) + updatedBackground = graphics.chatServiceBubbleFillImage } - let (size, apply) = labelLayout(TextNodeLayoutArguments(attributedString: NSAttributedString(string: item.strings.Channel_NotificationLoading, font: titleFont, textColor: item.theme.chat.serviceMessage.serviceMessagePrimaryTextColor), backgroundColor: nil, maximumNumberOfLines: 1, truncationType: .end, constrainedSize: CGSize(width: params.width, height: CGFloat.greatestFiniteMagnitude), alignment: .natural, cutout: nil, insets: UIEdgeInsets())) + let serviceColor = serviceMessageColorComponents(theme: item.presentationData.theme.theme, wallpaper: item.presentationData.theme.wallpaper) + + let (size, apply) = labelLayout(TextNodeLayoutArguments(attributedString: NSAttributedString(string: item.presentationData.strings.Channel_NotificationLoading, font: titleFont, textColor: serviceColor.primaryText), backgroundColor: nil, maximumNumberOfLines: 1, truncationType: .end, constrainedSize: CGSize(width: params.width, height: CGFloat.greatestFiniteMagnitude), alignment: .natural, cutout: nil, insets: UIEdgeInsets())) let backgroundSize = CGSize(width: size.size.width + 8.0 + 8.0, height: 20.0) diff --git a/TelegramUI/ChatListController.swift b/TelegramUI/ChatListController.swift index 7d5e68b3ea..d11c9c006d 100644 --- a/TelegramUI/ChatListController.swift +++ b/TelegramUI/ChatListController.swift @@ -369,7 +369,11 @@ public class ChatListController: TelegramController, KeyShortcutResponder, UIVie }) } - navigateToChatController(navigationController: navigationController, account: strongSelf.account, chatLocation: .peer(peerId), animated: animated, completion: { [weak self] in + var scrollToEndIfExists = false + if let layout = strongSelf.validLayout, case .regular = layout.metrics.widthClass { + scrollToEndIfExists = true + } + navigateToChatController(navigationController: navigationController, account: strongSelf.account, chatLocation: .peer(peerId), scrollToEndIfExists: scrollToEndIfExists, animated: animated, completion: { [weak self] in self?.chatListDisplayNode.chatListNode.clearHighlightAnimated(true) }) } @@ -379,7 +383,11 @@ public class ChatListController: TelegramController, KeyShortcutResponder, UIVie self.chatListDisplayNode.chatListNode.groupSelected = { [weak self] groupId in if let strongSelf = self { if let navigationController = strongSelf.navigationController as? NavigationController { - navigateToChatController(navigationController: navigationController, account: strongSelf.account, chatLocation: .group(groupId)) + var scrollToEndIfExists = false + if let layout = strongSelf.validLayout, case .regular = layout.metrics.widthClass { + scrollToEndIfExists = true + } + navigateToChatController(navigationController: navigationController, account: strongSelf.account, chatLocation: .group(groupId), scrollToEndIfExists: scrollToEndIfExists) strongSelf.chatListDisplayNode.chatListNode.clearHighlightAnimated(true) } } diff --git a/TelegramUI/ChatLoadingNode.swift b/TelegramUI/ChatLoadingNode.swift index 87fd6060bf..23d9362aaa 100644 --- a/TelegramUI/ChatLoadingNode.swift +++ b/TelegramUI/ChatLoadingNode.swift @@ -1,19 +1,23 @@ import Foundation import AsyncDisplayKit import Display +import TelegramCore final class ChatLoadingNode: ASDisplayNode { private let backgroundNode: ASImageNode private let activityIndicator: ActivityIndicator - init(theme: PresentationTheme) { + init(theme: PresentationTheme, chatWallpaper: TelegramWallpaper) { self.backgroundNode = ASImageNode() self.backgroundNode.isLayerBacked = true self.backgroundNode.displayWithoutProcessing = true self.backgroundNode.displaysAsynchronously = false - self.backgroundNode.image = PresentationResourcesChat.chatLoadingIndicatorBackgroundImage(theme) - self.activityIndicator = ActivityIndicator(type: .custom(theme.chat.serviceMessage.serviceMessagePrimaryTextColor, 22.0, 2.0, false), speed: .regular) + let graphics = PresentationResourcesChat.principalGraphics(theme, wallpaper: chatWallpaper) + self.backgroundNode.image = graphics.chatLoadingIndicatorBackgroundImage + + let serviceColor = serviceMessageColorComponents(theme: theme, wallpaper: chatWallpaper) + self.activityIndicator = ActivityIndicator(type: .custom(serviceColor.primaryText, 22.0, 2.0, false), speed: .regular) super.init() diff --git a/TelegramUI/ChatMessageActionItemNode.swift b/TelegramUI/ChatMessageActionItemNode.swift index 1a298143ec..4c1f75fcca 100644 --- a/TelegramUI/ChatMessageActionItemNode.swift +++ b/TelegramUI/ChatMessageActionItemNode.swift @@ -22,7 +22,7 @@ private func peerMentionsAttributes(primaryTextColor: UIColor, peerIds: [(Int, P return result } -private func attributedServiceMessageString(theme: PresentationTheme, strings: PresentationStrings, message: Message, accountPeerId: PeerId) -> NSAttributedString? { +private func attributedServiceMessageString(theme: ChatPresentationThemeData, strings: PresentationStrings, message: Message, accountPeerId: PeerId) -> NSAttributedString? { return universalServiceMessageString(theme: theme, strings: strings, message: message, accountPeerId: accountPeerId) } @@ -30,12 +30,15 @@ func plainServiceMessageString(strings: PresentationStrings, message: Message, a return universalServiceMessageString(theme: nil, strings: strings, message: message, accountPeerId: accountPeerId)?.string } -private func universalServiceMessageString(theme: PresentationTheme?, strings: PresentationStrings, message: Message, accountPeerId: PeerId) -> NSAttributedString? { +private func universalServiceMessageString(theme: ChatPresentationThemeData?, strings: PresentationStrings, message: Message, accountPeerId: PeerId) -> NSAttributedString? { var attributedString: NSAttributedString? - let theme = theme?.chat.serviceMessage - - let primaryTextColor = theme?.serviceMessagePrimaryTextColor ?? UIColor.black + let primaryTextColor: UIColor + if let theme = theme { + primaryTextColor = serviceMessageColorComponents(theme: theme.theme, wallpaper: theme.wallpaper).primaryText + } else { + primaryTextColor = .black + } let bodyAttributes = MarkdownAttributeSet(font: titleFont, textColor: primaryTextColor, additionalAttributes: [:]) @@ -507,7 +510,7 @@ class ChatMessageActionBubbleContentNode: ChatMessageBubbleContentNode { let contentProperties = ChatMessageBubbleContentProperties(hidesSimpleAuthorHeader: true, headerSpacing: 0.0, hidesBackground: .always, forceFullCorners: false, forceAlignment: .center) return (contentProperties, nil, CGFloat.greatestFiniteMagnitude, { constrainedSize, position in - let attributedString = attributedServiceMessageString(theme: item.presentationData.theme.theme, strings: item.presentationData.strings, message: item.message, accountPeerId: item.account.peerId) + let attributedString = attributedServiceMessageString(theme: item.presentationData.theme, strings: item.presentationData.strings, message: item.message, accountPeerId: item.account.peerId) var image: TelegramMediaImage? for media in item.message.media { @@ -549,7 +552,8 @@ class ChatMessageActionBubbleContentNode: ChatMessageBubbleContentNode { } - let backgroundApply = backgroundLayout(item.presentationData.theme.theme.chat.serviceMessage.serviceMessageFillColor, labelRects, 10.0, 10.0, 0.0) + let serviceColor = serviceMessageColorComponents(theme: item.presentationData.theme.theme, wallpaper: item.presentationData.theme.wallpaper) + let backgroundApply = backgroundLayout(serviceColor.fill, labelRects, 10.0, 10.0, 0.0) var backgroundSize = CGSize(width: labelLayout.size.width + 8.0 + 8.0, height: labelLayout.size.height + 4.0) let layoutInsets = UIEdgeInsets(top: 4.0, left: 0.0, bottom: 4.0, right: 0.0) @@ -635,7 +639,8 @@ class ChatMessageActionBubbleContentNode: ChatMessageBubbleContentNode { if let current = self.linkHighlightingNode { linkHighlightingNode = current } else { - linkHighlightingNode = LinkHighlightingNode(color: item.presentationData.theme.theme.chat.serviceMessage.serviceMessageLinkHighlightColor) + let serviceColor = serviceMessageColorComponents(theme: item.presentationData.theme.theme, wallpaper: item.presentationData.theme.wallpaper) + linkHighlightingNode = LinkHighlightingNode(color: serviceColor.linkHighlight) linkHighlightingNode.inset = 2.5 self.linkHighlightingNode = linkHighlightingNode self.insertSubnode(linkHighlightingNode, belowSubnode: self.labelNode) diff --git a/TelegramUI/ChatMessageBubbleItemNode.swift b/TelegramUI/ChatMessageBubbleItemNode.swift index 248c310114..fe01f667b0 100644 --- a/TelegramUI/ChatMessageBubbleItemNode.swift +++ b/TelegramUI/ChatMessageBubbleItemNode.swift @@ -780,7 +780,7 @@ class ChatMessageBubbleItemNode: ChatMessageItemView { forwardSource = forwardInfo.author forwardAuthorSignature = nil } - let sizeAndApply = forwardInfoLayout(item.presentationData.theme.theme, item.presentationData.strings, .bubble(incoming: incoming), forwardSource, forwardAuthorSignature, CGSize(width: maximumNodeWidth - layoutConstants.text.bubbleInsets.left - layoutConstants.text.bubbleInsets.right, height: CGFloat.greatestFiniteMagnitude)) + let sizeAndApply = forwardInfoLayout(item.presentationData.theme, item.presentationData.strings, .bubble(incoming: incoming), forwardSource, forwardAuthorSignature, CGSize(width: maximumNodeWidth - layoutConstants.text.bubbleInsets.left - layoutConstants.text.bubbleInsets.right, height: CGFloat.greatestFiniteMagnitude)) forwardInfoSizeApply = (sizeAndApply.0, { sizeAndApply.1() }) forwardInfoOriginY = headerSize.height @@ -794,7 +794,7 @@ class ChatMessageBubbleItemNode: ChatMessageItemView { } else { headerSize.height += 2.0 } - let sizeAndApply = replyInfoLayout(item.presentationData.theme.theme, item.presentationData.strings, item.account, .bubble(incoming: incoming), replyMessage, CGSize(width: maximumNodeWidth - layoutConstants.text.bubbleInsets.left - layoutConstants.text.bubbleInsets.right, height: CGFloat.greatestFiniteMagnitude)) + let sizeAndApply = replyInfoLayout(item.presentationData.theme, item.presentationData.strings, item.account, .bubble(incoming: incoming), replyMessage, CGSize(width: maximumNodeWidth - layoutConstants.text.bubbleInsets.left - layoutConstants.text.bubbleInsets.right, height: CGFloat.greatestFiniteMagnitude)) replyInfoSizeApply = (sizeAndApply.0, { sizeAndApply.1() }) replyInfoOriginY = headerSize.height @@ -1101,7 +1101,7 @@ class ChatMessageBubbleItemNode: ChatMessageItemView { let layout = ListViewItemNodeLayout(contentSize: layoutSize, insets: layoutInsets) - let graphics = PresentationResourcesChat.principalGraphics(item.presentationData.theme.theme, wallpaper: !item.presentationData.theme.wallpaper.isEmpty) + let graphics = PresentationResourcesChat.principalGraphics(item.presentationData.theme.theme, wallpaper: item.presentationData.theme.wallpaper) var updatedMergedTop = mergedBottom var updatedMergedBottom = mergedTop @@ -1903,7 +1903,7 @@ class ChatMessageBubbleItemNode: ChatMessageItemView { if self.highlightedState != highlighted { self.highlightedState = highlighted if let backgroundType = self.backgroundType { - let graphics = PresentationResourcesChat.principalGraphics(item.presentationData.theme.theme, wallpaper: !item.presentationData.theme.wallpaper.isEmpty) + let graphics = PresentationResourcesChat.principalGraphics(item.presentationData.theme.theme, wallpaper: item.presentationData.theme.wallpaper) if highlighted { self.backgroundNode.setType(type: backgroundType, highlighted: true, graphics: graphics, transition: .immediate) diff --git a/TelegramUI/ChatMessageDateAndStatusNode.swift b/TelegramUI/ChatMessageDateAndStatusNode.swift index dedd852788..1635710b76 100644 --- a/TelegramUI/ChatMessageDateAndStatusNode.swift +++ b/TelegramUI/ChatMessageDateAndStatusNode.swift @@ -153,7 +153,7 @@ class ChatMessageDateAndStatusNode: ASDisplayNode { let themeUpdated = theme != currentTheme || type != currentType - let graphics = PresentationResourcesChat.principalGraphics(theme.theme, wallpaper: !theme.wallpaper.isEmpty) + let graphics = PresentationResourcesChat.principalGraphics(theme.theme, wallpaper: theme.wallpaper) switch type { case .BubbleIncoming: @@ -201,7 +201,8 @@ class ChatMessageDateAndStatusNode: ASDisplayNode { impressionImage = graphics.mediaImpressionIcon } case .FreeIncoming: - dateColor = theme.theme.chat.serviceMessage.serviceMessagePrimaryTextColor + let serviceColor = serviceMessageColorComponents(theme: theme.theme, wallpaper: theme.wallpaper) + dateColor = serviceColor.primaryText backgroundImage = graphics.dateAndStatusFreeBackground leftInset = 0.0 loadedCheckFullImage = graphics.checkFreeFullImage @@ -212,7 +213,8 @@ class ChatMessageDateAndStatusNode: ASDisplayNode { impressionImage = graphics.freeImpressionIcon } case let .FreeOutgoing(status): - dateColor = theme.theme.chat.serviceMessage.serviceMessagePrimaryTextColor + let serviceColor = serviceMessageColorComponents(theme: theme.theme, wallpaper: theme.wallpaper) + dateColor = serviceColor.primaryText outgoingStatus = status backgroundImage = graphics.dateAndStatusFreeBackground leftInset = 0.0 diff --git a/TelegramUI/ChatMessageDateHeader.swift b/TelegramUI/ChatMessageDateHeader.swift index 568cb9354d..332e2601a7 100644 --- a/TelegramUI/ChatMessageDateHeader.swift +++ b/TelegramUI/ChatMessageDateHeader.swift @@ -113,7 +113,7 @@ final class ChatMessageDateHeaderNode: ListViewItemHeaderNode { self.transform = CATransform3DMakeRotation(CGFloat.pi, 0.0, 0.0, 1.0) - let graphics = PresentationResourcesChat.principalGraphics(presentationData.theme.theme, wallpaper: !presentationData.theme.wallpaper.isEmpty) + let graphics = PresentationResourcesChat.principalGraphics(presentationData.theme.theme, wallpaper: presentationData.theme.wallpaper) self.backgroundNode.image = graphics.dateStaticBackground self.stickBackgroundNode.image = graphics.dateFloatingBackground @@ -169,7 +169,7 @@ final class ChatMessageDateHeaderNode: ListViewItemHeaderNode { } func updatePresentationData(_ presentationData: ChatPresentationData) { - let graphics = PresentationResourcesChat.principalGraphics(presentationData.theme.theme, wallpaper: !presentationData.theme.wallpaper.isEmpty) + let graphics = PresentationResourcesChat.principalGraphics(presentationData.theme.theme, wallpaper: presentationData.theme.wallpaper) self.backgroundNode.image = graphics.dateStaticBackground self.stickBackgroundNode.image = graphics.dateFloatingBackground diff --git a/TelegramUI/ChatMessageForwardInfoNode.swift b/TelegramUI/ChatMessageForwardInfoNode.swift index 37329e5a39..c4a06948b6 100644 --- a/TelegramUI/ChatMessageForwardInfoNode.swift +++ b/TelegramUI/ChatMessageForwardInfoNode.swift @@ -18,7 +18,7 @@ class ChatMessageForwardInfoNode: ASDisplayNode { super.init() } - class func asyncLayout(_ maybeNode: ChatMessageForwardInfoNode?) -> (_ theme: PresentationTheme, _ strings: PresentationStrings, _ type: ChatMessageForwardInfoType, _ peer: Peer, _ authorName: String?, _ constrainedSize: CGSize) -> (CGSize, () -> ChatMessageForwardInfoNode) { + class func asyncLayout(_ maybeNode: ChatMessageForwardInfoNode?) -> (_ theme: ChatPresentationThemeData, _ strings: PresentationStrings, _ type: ChatMessageForwardInfoType, _ peer: Peer, _ authorName: String?, _ constrainedSize: CGSize) -> (CGSize, () -> ChatMessageForwardInfoNode) { let textNodeLayout = TextNode.asyncLayout(maybeNode?.textNode) return { theme, strings, type, peer, authorName, constrainedSize in @@ -34,10 +34,11 @@ class ChatMessageForwardInfoNode: ASDisplayNode { switch type { case let .bubble(incoming): - titleColor = incoming ? theme.chat.bubble.incomingAccentTextColor : theme.chat.bubble.outgoingAccentTextColor + titleColor = incoming ? theme.theme.chat.bubble.incomingAccentTextColor : theme.theme.chat.bubble.outgoingAccentTextColor completeSourceString = strings.Message_ForwardedMessage(peerString) case .standalone: - titleColor = theme.chat.serviceMessage.serviceMessagePrimaryTextColor + let serviceColor = serviceMessageColorComponents(theme: theme.theme, wallpaper: theme.wallpaper) + titleColor = serviceColor.primaryText completeSourceString = strings.Message_ForwardedMessageShort(peerString) } diff --git a/TelegramUI/ChatMessageInstantVideoItemNode.swift b/TelegramUI/ChatMessageInstantVideoItemNode.swift index 123a750fdf..6b605d3247 100644 --- a/TelegramUI/ChatMessageInstantVideoItemNode.swift +++ b/TelegramUI/ChatMessageInstantVideoItemNode.swift @@ -141,14 +141,16 @@ class ChatMessageInstantVideoItemNode: ChatMessageItemView { for attribute in item.message.attributes { if let replyAttribute = attribute as? ReplyMessageAttribute, let replyMessage = item.message.associatedMessages[replyAttribute.messageId] { let availableWidth = max(60.0, params.width - params.leftInset - params.rightInset - videoLayout.contentSize.width - 20.0 - layoutConstants.bubble.edgeInset * 2.0 - avatarInset - layoutConstants.bubble.contentInsets.left) - replyInfoApply = makeReplyInfoLayout(item.presentationData.theme.theme, item.presentationData.strings, item.account, .standalone, replyMessage, CGSize(width: availableWidth, height: CGFloat.greatestFiniteMagnitude)) + replyInfoApply = makeReplyInfoLayout(item.presentationData.theme, item.presentationData.strings, item.account, .standalone, replyMessage, CGSize(width: availableWidth, height: CGFloat.greatestFiniteMagnitude)) if let currentReplyBackgroundNode = currentReplyBackgroundNode { updatedReplyBackgroundNode = currentReplyBackgroundNode } else { updatedReplyBackgroundNode = ASImageNode() } - replyBackgroundImage = PresentationResourcesChat.chatServiceBubbleFillImage(item.presentationData.theme.theme) + + let graphics = PresentationResourcesChat.principalGraphics(item.presentationData.theme.theme, wallpaper: item.presentationData.theme.wallpaper) + replyBackgroundImage = graphics.chatServiceBubbleFillImage break } else if let attribute = attribute as? InlineBotMessageAttribute { if let peerId = attribute.peerId, let bot = item.message.peers[peerId] as? TelegramUser { @@ -184,7 +186,7 @@ class ChatMessageInstantVideoItemNode: ChatMessageItemView { forwardAuthorSignature = nil } let availableWidth = max(60.0, availableContentWidth - videoLayout.contentSize.width + 6.0) - forwardInfoSizeApply = makeForwardInfoLayout(item.presentationData.theme.theme, item.presentationData.strings, .standalone, forwardSource, forwardAuthorSignature, CGSize(width: availableWidth, height: CGFloat.greatestFiniteMagnitude)) + forwardInfoSizeApply = makeForwardInfoLayout(item.presentationData.theme, item.presentationData.strings, .standalone, forwardSource, forwardAuthorSignature, CGSize(width: availableWidth, height: CGFloat.greatestFiniteMagnitude)) if let currentForwardBackgroundNode = currentForwardBackgroundNode { updatedForwardBackgroundNode = currentForwardBackgroundNode @@ -192,7 +194,8 @@ class ChatMessageInstantVideoItemNode: ChatMessageItemView { updatedForwardBackgroundNode = ASImageNode() } - forwardBackgroundImage = PresentationResourcesChat.chatServiceBubbleFillImage(item.presentationData.theme.theme) + let graphics = PresentationResourcesChat.principalGraphics(item.presentationData.theme.theme, wallpaper: item.presentationData.theme.wallpaper) + forwardBackgroundImage = graphics.chatServiceBubbleFillImage } var maxContentWidth = videoLayout.contentSize.width diff --git a/TelegramUI/ChatMessageInteractiveFileNode.swift b/TelegramUI/ChatMessageInteractiveFileNode.swift index 0692445ef8..afa58d89bc 100644 --- a/TelegramUI/ChatMessageInteractiveFileNode.swift +++ b/TelegramUI/ChatMessageInteractiveFileNode.swift @@ -365,7 +365,7 @@ final class ChatMessageInteractiveFileNode: ASDisplayNode { if hasThumbnail { fileIconImage = nil } else { - let principalGraphics = PresentationResourcesChat.principalGraphics(presentationData.theme.theme, wallpaper: !presentationData.theme.wallpaper.isEmpty) + let principalGraphics = PresentationResourcesChat.principalGraphics(presentationData.theme.theme, wallpaper: presentationData.theme.wallpaper) fileIconImage = incoming ? principalGraphics.radialIndicatorFileIconIncoming : principalGraphics.radialIndicatorFileIconOutgoing } diff --git a/TelegramUI/ChatMessageInteractiveInstantVideoNode.swift b/TelegramUI/ChatMessageInteractiveInstantVideoNode.swift index 4f3eec2696..d7aad8bdcb 100644 --- a/TelegramUI/ChatMessageInteractiveInstantVideoNode.swift +++ b/TelegramUI/ChatMessageInteractiveInstantVideoNode.swift @@ -312,8 +312,9 @@ class ChatMessageInteractiveInstantVideoNode: ASDisplayNode { let durationFillColor: UIColor switch statusDisplayType { case .free: - durationTextColor = theme.theme.chat.serviceMessage.serviceMessagePrimaryTextColor - durationFillColor = theme.theme.chat.serviceMessage.serviceMessageFillColor + let serviceColor = serviceMessageColorComponents(theme: theme.theme, wallpaper: theme.wallpaper) + durationTextColor = serviceColor.primaryText + durationFillColor = serviceColor.fill case .bubble: durationFillColor = .clear if item.message.effectivelyIncoming(item.account.peerId) { diff --git a/TelegramUI/ChatMessageReplyInfoNode.swift b/TelegramUI/ChatMessageReplyInfoNode.swift index ca92461545..112f133f45 100644 --- a/TelegramUI/ChatMessageReplyInfoNode.swift +++ b/TelegramUI/ChatMessageReplyInfoNode.swift @@ -39,7 +39,7 @@ class ChatMessageReplyInfoNode: ASDisplayNode { self.contentNode.addSubnode(self.lineNode) } - class func asyncLayout(_ maybeNode: ChatMessageReplyInfoNode?) -> (_ theme: PresentationTheme, _ strings: PresentationStrings, _ account: Account, _ type: ChatMessageReplyInfoType, _ message: Message, _ constrainedSize: CGSize) -> (CGSize, () -> ChatMessageReplyInfoNode) { + class func asyncLayout(_ maybeNode: ChatMessageReplyInfoNode?) -> (_ theme: ChatPresentationThemeData, _ strings: PresentationStrings, _ account: Account, _ type: ChatMessageReplyInfoType, _ message: Message, _ constrainedSize: CGSize) -> (CGSize, () -> ChatMessageReplyInfoNode) { let titleNodeLayout = TextNode.asyncLayout(maybeNode?.titleNode) let textNodeLayout = TextNode.asyncLayout(maybeNode?.textNode) @@ -50,23 +50,24 @@ class ChatMessageReplyInfoNode: ASDisplayNode { let titleString = message.author?.displayTitle(strings: strings) ?? strings.User_DeletedAccount let (textString, isMedia) = descriptionStringForMessage(message, strings: strings, accountPeerId: account.peerId) - let placeholderColor: UIColor = message.effectivelyIncoming(account.peerId) ? theme.chat.bubble.incomingMediaPlaceholderColor : theme.chat.bubble.outgoingMediaPlaceholderColor + let placeholderColor: UIColor = message.effectivelyIncoming(account.peerId) ? theme.theme.chat.bubble.incomingMediaPlaceholderColor : theme.theme.chat.bubble.outgoingMediaPlaceholderColor let titleColor: UIColor let lineImage: UIImage? let textColor: UIColor switch type { case let .bubble(incoming): - titleColor = incoming ? theme.chat.bubble.incomingAccentTextColor : theme.chat.bubble.outgoingAccentTextColor - lineImage = incoming ? PresentationResourcesChat.chatBubbleVerticalLineIncomingImage(theme) : PresentationResourcesChat.chatBubbleVerticalLineOutgoingImage(theme) + titleColor = incoming ? theme.theme.chat.bubble.incomingAccentTextColor : theme.theme.chat.bubble.outgoingAccentTextColor + lineImage = incoming ? PresentationResourcesChat.chatBubbleVerticalLineIncomingImage(theme.theme) : PresentationResourcesChat.chatBubbleVerticalLineOutgoingImage(theme.theme) if isMedia { - textColor = incoming ? theme.chat.bubble.incomingSecondaryTextColor : theme.chat.bubble.outgoingSecondaryTextColor + textColor = incoming ? theme.theme.chat.bubble.incomingSecondaryTextColor : theme.theme.chat.bubble.outgoingSecondaryTextColor } else { - textColor = incoming ? theme.chat.bubble.incomingPrimaryTextColor : theme.chat.bubble.outgoingPrimaryTextColor + textColor = incoming ? theme.theme.chat.bubble.incomingPrimaryTextColor : theme.theme.chat.bubble.outgoingPrimaryTextColor } case .standalone: - titleColor = theme.chat.serviceMessage.serviceMessagePrimaryTextColor - lineImage = PresentationResourcesChat.chatServiceVerticalLineImage(theme) + let serviceColor = serviceMessageColorComponents(theme: theme.theme, wallpaper: theme.wallpaper) + titleColor = serviceColor.primaryText + lineImage = PresentationResourcesChat.chatServiceVerticalLineImage(theme.theme) textColor = titleColor } diff --git a/TelegramUI/ChatMessageStickerItemNode.swift b/TelegramUI/ChatMessageStickerItemNode.swift index cedc5818df..4e476fc917 100644 --- a/TelegramUI/ChatMessageStickerItemNode.swift +++ b/TelegramUI/ChatMessageStickerItemNode.swift @@ -234,14 +234,16 @@ class ChatMessageStickerItemNode: ChatMessageItemView { for attribute in item.message.attributes { if let replyAttribute = attribute as? ReplyMessageAttribute, let replyMessage = item.message.associatedMessages[replyAttribute.messageId] { let availableWidth = max(60.0, params.width - params.leftInset - params.rightInset - imageSize.width - 20.0 - layoutConstants.bubble.edgeInset * 2.0 - avatarInset - layoutConstants.bubble.contentInsets.left) - replyInfoApply = makeReplyInfoLayout(item.presentationData.theme.theme, item.presentationData.strings, item.account, .standalone, replyMessage, CGSize(width: availableWidth, height: CGFloat.greatestFiniteMagnitude)) + replyInfoApply = makeReplyInfoLayout(item.presentationData.theme, item.presentationData.strings, item.account, .standalone, replyMessage, CGSize(width: availableWidth, height: CGFloat.greatestFiniteMagnitude)) if let currentReplyBackgroundNode = currentReplyBackgroundNode { updatedReplyBackgroundNode = currentReplyBackgroundNode } else { updatedReplyBackgroundNode = ASImageNode() } - replyBackgroundImage = PresentationResourcesChat.chatFreeformContentAdditionalInfoBackgroundImage(item.presentationData.theme.theme) + + let graphics = PresentationResourcesChat.principalGraphics(item.presentationData.theme.theme, wallpaper: item.presentationData.theme.wallpaper) + replyBackgroundImage = graphics.chatFreeformContentAdditionalInfoBackgroundImage break } } diff --git a/TelegramUI/ChatMessageWebpageBubbleContentNode.swift b/TelegramUI/ChatMessageWebpageBubbleContentNode.swift index 7bdc5b5e35..2ae65ec7fc 100644 --- a/TelegramUI/ChatMessageWebpageBubbleContentNode.swift +++ b/TelegramUI/ChatMessageWebpageBubbleContentNode.swift @@ -202,6 +202,8 @@ final class ChatMessageWebpageBubbleContentNode: ChatMessageBubbleContentNode { switch type { case .twitter, .instagram: entityTypes.insert(.mention) + entityTypes.insert(.hashtag) + entityTypes.insert(.external) default: break } @@ -328,6 +330,21 @@ final class ChatMessageWebpageBubbleContentNode: ChatMessageBubbleContentNode { break } } + case let .hashtag(_, value): + if let webPage = self.webPage, case let .Loaded(content) = webPage.content { + var hashtag = value + if hashtag.hasPrefix("#") { + hashtag = String(hashtag[hashtag.index(after: hashtag.startIndex)...]) + } + switch websiteType(of: content) { + case .twitter: + return .url(url: "https://twitter.com/hashtag/\(hashtag)", concealed: false) + case .instagram: + return .url(url: "https://instagram.com/explore/tags/\(hashtag)", concealed: false) + default: + break + } + } default: return result } diff --git a/TelegramUI/ChatPresentationData.swift b/TelegramUI/ChatPresentationData.swift index 166b1caad6..5c5e32c3a8 100644 --- a/TelegramUI/ChatPresentationData.swift +++ b/TelegramUI/ChatPresentationData.swift @@ -32,6 +32,14 @@ extension TelegramWallpaper { return true } } + var isBuiltin: Bool { + switch self { + case .builtin: + return true + default: + return false + } + } } public final class ChatPresentationThemeData: Equatable { diff --git a/TelegramUI/ChatRecentActionsControllerNode.swift b/TelegramUI/ChatRecentActionsControllerNode.swift index 2e3a4e3a98..821e6a6a12 100644 --- a/TelegramUI/ChatRecentActionsControllerNode.swift +++ b/TelegramUI/ChatRecentActionsControllerNode.swift @@ -91,8 +91,8 @@ final class ChatRecentActionsControllerNode: ViewControllerTracingNode { self.listNode = ListView() self.listNode.transform = CATransform3DMakeRotation(CGFloat(Double.pi), 0.0, 0.0, 1.0) - self.loadingNode = ChatLoadingNode(theme: self.presentationData.theme) - self.emptyNode = ChatRecentActionsEmptyNode(theme: self.presentationData.theme) + self.loadingNode = ChatLoadingNode(theme: self.presentationData.theme, chatWallpaper: self.presentationData.chatWallpaper) + self.emptyNode = ChatRecentActionsEmptyNode(theme: self.presentationData.theme, chatWallpaper: self.presentationData.chatWallpaper) self.emptyNode.alpha = 0.0 self.state = ChatRecentActionsControllerState(chatWallpaper: self.presentationData.chatWallpaper, theme: self.presentationData.theme, strings: self.presentationData.strings, fontSize: self.presentationData.fontSize) diff --git a/TelegramUI/ChatRecentActionsEmptyNode.swift b/TelegramUI/ChatRecentActionsEmptyNode.swift index 5a4642142c..d2cd86b145 100644 --- a/TelegramUI/ChatRecentActionsEmptyNode.swift +++ b/TelegramUI/ChatRecentActionsEmptyNode.swift @@ -1,12 +1,14 @@ import Foundation import Display import AsyncDisplayKit +import TelegramCore private let titleFont = Font.medium(16.0) private let textFont = Font.regular(15.0) final class ChatRecentActionsEmptyNode: ASDisplayNode { private var theme: PresentationTheme + private var chatWallpaper: TelegramWallpaper private let backgroundNode: ASImageNode private let titleNode: TextNode @@ -17,8 +19,9 @@ final class ChatRecentActionsEmptyNode: ASDisplayNode { private var title: String = "" private var text: String = "" - init(theme: PresentationTheme) { + init(theme: PresentationTheme, chatWallpaper: TelegramWallpaper) { self.theme = theme + self.chatWallpaper = chatWallpaper self.backgroundNode = ASImageNode() self.backgroundNode.isLayerBacked = true @@ -31,7 +34,8 @@ final class ChatRecentActionsEmptyNode: ASDisplayNode { super.init() - self.backgroundNode.image = PresentationResourcesChat.chatEmptyItemBackgroundImage(self.theme) + let graphics = PresentationResourcesChat.principalGraphics(theme, wallpaper: chatWallpaper) + self.backgroundNode.image = graphics.chatEmptyItemBackgroundImage self.addSubnode(self.backgroundNode) self.addSubnode(self.titleNode) @@ -48,9 +52,11 @@ final class ChatRecentActionsEmptyNode: ASDisplayNode { let makeTitleLayout = TextNode.asyncLayout(self.titleNode) let makeTextLayout = TextNode.asyncLayout(self.textNode) - let (titleLayout, titleApply) = makeTitleLayout(TextNodeLayoutArguments(attributedString: NSAttributedString(string: self.title, font: titleFont, textColor: self.theme.chat.serviceMessage.serviceMessagePrimaryTextColor), backgroundColor: nil, maximumNumberOfLines: 1, truncationType: .end, constrainedSize: CGSize(width: maxTextWidth, height: CGFloat.greatestFiniteMagnitude), alignment: .center, lineSpacing: 0.0, cutout: nil, insets: UIEdgeInsets())) + let serviceColor = serviceMessageColorComponents(theme: self.theme, wallpaper: self.chatWallpaper) + + let (titleLayout, titleApply) = makeTitleLayout(TextNodeLayoutArguments(attributedString: NSAttributedString(string: self.title, font: titleFont, textColor: serviceColor.primaryText), backgroundColor: nil, maximumNumberOfLines: 1, truncationType: .end, constrainedSize: CGSize(width: maxTextWidth, height: CGFloat.greatestFiniteMagnitude), alignment: .center, lineSpacing: 0.0, cutout: nil, insets: UIEdgeInsets())) let spacing: CGFloat = titleLayout.size.height.isZero ? 0.0 : 5.0 - let (textLayout, textApply) = makeTextLayout(TextNodeLayoutArguments(attributedString: NSAttributedString(string: self.text, font: textFont, textColor: self.theme.chat.serviceMessage.serviceMessagePrimaryTextColor), backgroundColor: nil, maximumNumberOfLines: 0, truncationType: .end, constrainedSize: CGSize(width: maxTextWidth, height: CGFloat.greatestFiniteMagnitude), alignment: .center, lineSpacing: 0.0, cutout: nil, insets: UIEdgeInsets())) + let (textLayout, textApply) = makeTextLayout(TextNodeLayoutArguments(attributedString: NSAttributedString(string: self.text, font: textFont, textColor: serviceColor.primaryText), backgroundColor: nil, maximumNumberOfLines: 0, truncationType: .end, constrainedSize: CGSize(width: maxTextWidth, height: CGFloat.greatestFiniteMagnitude), alignment: .center, lineSpacing: 0.0, cutout: nil, insets: UIEdgeInsets())) let contentSize = CGSize(width: max(titleLayout.size.width, textLayout.size.width) + insets.left + insets.right, height: insets.top + insets.bottom + titleLayout.size.height + spacing + textLayout.size.height) let backgroundFrame = CGRect(origin: CGPoint(x: floor((size.width - contentSize.width) / 2.0), y: floor((size.height - contentSize.height) / 2.0)), size: contentSize) diff --git a/TelegramUI/ContactListNode.swift b/TelegramUI/ContactListNode.swift index a81ceeb2db..e0ada2e2ef 100644 --- a/TelegramUI/ContactListNode.swift +++ b/TelegramUI/ContactListNode.swift @@ -413,7 +413,7 @@ private func contactListNodeEntries(accountPeer: Peer?, peers: [ContactListPeer] var commonHeader: ListViewItemHeader? switch presentation { case .orderedByPresence: - commonHeader = ChatListSearchItemHeader(type: .contacts, theme: theme, strings: strings, actionTitle: nil, action: nil) + commonHeader = nil //ChatListSearchItemHeader(type: .contacts, theme: theme, strings: strings, actionTitle: nil, action: nil) default: break } @@ -568,7 +568,7 @@ final class ContactListNode: ASDisplayNode { private var presentationDataDisposable: Disposable? private let themeAndStringsPromise: Promise<(PresentationTheme, PresentationStrings, PresentationDateTimeFormat, PresentationPersonNameOrder, PresentationPersonNameOrder, Bool)> - private let authorizationNode: PermissionControllerNode + private var authorizationNode: PermissionContentNode? init(account: Account, presentation: ContactListPresentation, filters: [ContactListFilter] = [.excludeSelf], selectionState: ContactListNodeGroupSelectionState? = nil) { self.account = account @@ -582,8 +582,7 @@ final class ContactListNode: ASDisplayNode { self.themeAndStringsPromise = Promise((self.presentationData.theme, self.presentationData.strings, self.presentationData.dateTimeFormat, self.presentationData.nameSortOrder, self.presentationData.nameDisplayOrder, self.presentationData.disableAnimations)) - self.authorizationNode = PermissionControllerNode(theme: defaultLightAuthorizationTheme, strings: self.presentationData.strings) - self.authorizationNode.updateData(subject: .contacts, currentStatus: .denied) + //self.authorizationNode = //PermissionContentNode(theme: self.presentationData.theme, strings: self.presentationData.strings) super.init() @@ -814,12 +813,12 @@ final class ContactListNode: ASDisplayNode { fixSearchableListNodeScrolling(strongSelf.listNode) } - self.authorizationNode.allow = { [weak self] in - self?.account.telegramApplicationContext.applicationBindings.openSettings() - } - self.authorizationNode.openPrivacyPolicy = { [weak self] in - self?.openPrivacyPolicy?() - } +// self.authorizationNode.allow = { [weak self] in +// self?.account.telegramApplicationContext.applicationBindings.openSettings() +// } +// self.authorizationNode.openPrivacyPolicy = { [weak self] in +// self?.openPrivacyPolicy?() +// } self.enableUpdates = true } @@ -870,9 +869,9 @@ final class ContactListNode: ASDisplayNode { self.listNode.transaction(deleteIndices: [], insertIndicesAndItems: [], updateIndicesAndItems: [], options: [.Synchronous, .LowLatency], scrollToItem: nil, updateSizeAndInsets: updateSizeAndInsets, stationaryItemRange: nil, updateOpaqueState: nil, completion: { _ in }) - let sublayout = layout.addedInsets(insets: UIEdgeInsetsMake(0.0, 0.0, 40.0, 0.0)) - transition.updateFrame(node: self.authorizationNode, frame: self.bounds) - self.authorizationNode.containerLayoutUpdated(sublayout, navigationBarHeight: 0.0, transition: transition) + //let sublayout = layout.addedInsets(insets: UIEdgeInsetsMake(0.0, 0.0, 40.0, 0.0)) + //transition.updateFrame(node: self.authorizationNode, frame: self.bounds) + //self.authorizationNode.containerLayoutUpdated(sublayout, navigationBarHeight: 0.0, transition: transition) if !self.hasValidLayout { self.hasValidLayout = true diff --git a/TelegramUI/ContactsController.swift b/TelegramUI/ContactsController.swift index 010972c2f8..81e5502bbf 100644 --- a/TelegramUI/ContactsController.swift +++ b/TelegramUI/ContactsController.swift @@ -65,7 +65,8 @@ public class ContactsController: ViewController { self.authorizationDisposable = (DeviceAccess.authorizationStatus(account: account, subject: .contacts) |> deliverOnMainQueue).start(next: { [weak self] status in if let strongSelf = self { - strongSelf.tabBarItem.badgeValue = status != .allowed ? "!" : nil + strongSelf.tabBarItem.badgeValue = nil + //strongSelf.tabBarItem.badgeValue = status != .allowed ? "!" : nil } }) } diff --git a/TelegramUI/DeclareEncodables.swift b/TelegramUI/DeclareEncodables.swift index 5fc61daeea..ef779935b5 100644 --- a/TelegramUI/DeclareEncodables.swift +++ b/TelegramUI/DeclareEncodables.swift @@ -26,6 +26,8 @@ private var telegramUIDeclaredEncodables: Void = { declareEncodable(CachedChannelAdminIds.self, f: { CachedChannelAdminIds(decoder: $0) }) declareEncodable(StickerSettings.self, f: { StickerSettings(decoder: $0) }) declareEncodable(InstantPagePresentationSettings.self, f: { InstantPagePresentationSettings(decoder: $0) }) + declareEncodable(InstantPageStoredState.self, f: { InstantPageStoredState(decoder: $0) }) + declareEncodable(InstantPageStoredDetailsState.self, f: { InstantPageStoredDetailsState(decoder: $0) }) declareEncodable(WatchPresetSettings.self, f: { WatchPresetSettings(decoder: $0) }) return }() diff --git a/TelegramUI/DefaultDarkAccentPresentationTheme.swift b/TelegramUI/DefaultDarkAccentPresentationTheme.swift index 16ba3932e1..426137c1c7 100644 --- a/TelegramUI/DefaultDarkAccentPresentationTheme.swift +++ b/TelegramUI/DefaultDarkAccentPresentationTheme.swift @@ -189,14 +189,10 @@ private let bubble = PresentationThemeChatBubble( ) private let serviceMessage = PresentationThemeServiceMessage( - serviceMessageFillColor: UIColor(rgb: 0x18222D, alpha: 1.0), - serviceMessagePrimaryTextColor: UIColor(rgb: 0xffffff), - serviceMessageLinkHighlightColor: UIColor(rgb: 0xffffff, alpha: 0.12), + components: PresentationThemeServiceMessageColor(withDefaultWallpaper: PresentationThemeServiceMessageColorComponents(fill: UIColor(rgb: 0x18222D, alpha: 1.0), primaryText: UIColor(rgb: 0xffffff), linkHighlight: UIColor(rgb: 0xffffff, alpha: 0.12), dateFillStatic: UIColor(rgb: 0x18222D, alpha: 1.0), dateFillFloating: UIColor(rgb: 0x18222D, alpha: 0.2)), withCustomWallpaper: PresentationThemeServiceMessageColorComponents(fill: UIColor(rgb: 0x18222D, alpha: 1.0), primaryText: UIColor(rgb: 0xffffff), linkHighlight: UIColor(rgb: 0xffffff, alpha: 0.12), dateFillStatic: UIColor(rgb: 0x18222D, alpha: 1.0), dateFillFloating: UIColor(rgb: 0x18222D, alpha: 0.2))), unreadBarFillColor: UIColor(rgb: 0x213040), unreadBarStrokeColor: UIColor(rgb: 0x213040), unreadBarTextColor: UIColor(rgb: 0xffffff), - dateFillStaticColor: UIColor(rgb: 0x18222D, alpha: 1.0), - dateFillFloatingColor: UIColor(rgb: 0x18222D, alpha: 0.2), dateTextColor: UIColor(rgb: 0xffffff) ) diff --git a/TelegramUI/DefaultDarkPresentationTheme.swift b/TelegramUI/DefaultDarkPresentationTheme.swift index 22c7129cbf..191386defa 100644 --- a/TelegramUI/DefaultDarkPresentationTheme.swift +++ b/TelegramUI/DefaultDarkPresentationTheme.swift @@ -189,14 +189,10 @@ private let bubble = PresentationThemeChatBubble( ) private let serviceMessage = PresentationThemeServiceMessage( - serviceMessageFillColor: UIColor(rgb: 0x1f1f1f, alpha: 1.0), - serviceMessagePrimaryTextColor: UIColor(rgb: 0xffffff), - serviceMessageLinkHighlightColor: UIColor(rgb: 0xffffff, alpha: 0.12), //!!! + components: PresentationThemeServiceMessageColor(withDefaultWallpaper: PresentationThemeServiceMessageColorComponents(fill: UIColor(rgb: 0x1f1f1f, alpha: 1.0), primaryText: UIColor(rgb: 0xffffff), linkHighlight: UIColor(rgb: 0xffffff, alpha: 0.12), dateFillStatic: UIColor(rgb: 0x1f1f1f, alpha: 1.0), dateFillFloating: UIColor(rgb: 0xffffff, alpha: 0.2)), withCustomWallpaper: PresentationThemeServiceMessageColorComponents(fill: UIColor(rgb: 0x1f1f1f, alpha: 1.0), primaryText: UIColor(rgb: 0xffffff), linkHighlight: UIColor(rgb: 0xffffff, alpha: 0.12), dateFillStatic: UIColor(rgb: 0x1f1f1f, alpha: 1.0), dateFillFloating: UIColor(rgb: 0xffffff, alpha: 0.2))), unreadBarFillColor: UIColor(rgb: 0x1b1b1b), //!!! unreadBarStrokeColor: UIColor(rgb: 0x000000), unreadBarTextColor: UIColor(rgb: 0xb2b2b2), //!!! - dateFillStaticColor: UIColor(rgb: 0x1f1f1f, alpha: 1.0), - dateFillFloatingColor: UIColor(rgb: 0xffffff, alpha: 0.2), dateTextColor: UIColor(rgb: 0xb2b2b2) ) diff --git a/TelegramUI/DefaultPresentationTheme.swift b/TelegramUI/DefaultPresentationTheme.swift index 39628d4fc6..e4c027537d 100644 --- a/TelegramUI/DefaultPresentationTheme.swift +++ b/TelegramUI/DefaultPresentationTheme.swift @@ -273,26 +273,18 @@ private func makeDefaultPresentationTheme(accentColor: UIColor, day: Bool) -> Pr ) let serviceMessage = PresentationThemeServiceMessage( - serviceMessageFillColor: UIColor(rgb: 0x748391, alpha: 0.45), - serviceMessagePrimaryTextColor: .white, - serviceMessageLinkHighlightColor: UIColor(rgb: 0x748391, alpha: 0.25), + components: PresentationThemeServiceMessageColor(withDefaultWallpaper: PresentationThemeServiceMessageColorComponents(fill: UIColor(rgb: 0x748391, alpha: 0.45), primaryText: .white, linkHighlight: UIColor(rgb: 0x748391, alpha: 0.25), dateFillStatic: UIColor(rgb: 0x748391, alpha: 0.45), dateFillFloating: UIColor(rgb: 0x939fab, alpha: 0.5)), withCustomWallpaper: PresentationThemeServiceMessageColorComponents(fill: UIColor(rgb: 0x000000, alpha: 0.25), primaryText: .white, linkHighlight: UIColor(rgb: 0x748391, alpha: 0.25), dateFillStatic: UIColor(rgb: 0x000000, alpha: 0.25), dateFillFloating: UIColor(rgb: 0x000000, alpha: 0.2))), unreadBarFillColor: UIColor(white: 1.0, alpha: 0.9), unreadBarStrokeColor: UIColor(white: 0.0, alpha: 0.2), unreadBarTextColor: UIColor(rgb: 0x86868d), - dateFillStaticColor: UIColor(rgb: 0x748391, alpha: 0.45), - dateFillFloatingColor: UIColor(rgb: 0x939fab, alpha: 0.5), dateTextColor: .white ) let serviceMessageDay = PresentationThemeServiceMessage( - serviceMessageFillColor: UIColor(rgb: 0xffffff, alpha: 0.8), - serviceMessagePrimaryTextColor: UIColor(rgb: 0x8D8E93), - serviceMessageLinkHighlightColor: UIColor(rgb: 0x748391, alpha: 0.25), + components: PresentationThemeServiceMessageColor(withDefaultWallpaper: PresentationThemeServiceMessageColorComponents(fill: UIColor(rgb: 0xffffff, alpha: 0.8), primaryText: UIColor(rgb: 0x8D8E93), linkHighlight: UIColor(rgb: 0x748391, alpha: 0.25), dateFillStatic: UIColor(rgb: 0xffffff, alpha: 0.8), dateFillFloating: UIColor(rgb: 0xffffff, alpha: 0.8)), withCustomWallpaper: PresentationThemeServiceMessageColorComponents(fill: UIColor(rgb: 0xffffff, alpha: 0.8), primaryText: UIColor(rgb: 0x8D8E93), linkHighlight: UIColor(rgb: 0x748391, alpha: 0.25), dateFillStatic: UIColor(rgb: 0xffffff, alpha: 0.8), dateFillFloating: UIColor(rgb: 0xffffff, alpha: 0.8))), unreadBarFillColor: UIColor(rgb: 0xffffff), unreadBarStrokeColor: UIColor(rgb: 0xffffff), unreadBarTextColor: UIColor(rgb: 0x8D8E93), - dateFillStaticColor: UIColor(rgb: 0xffffff, alpha: 0.8), - dateFillFloatingColor: UIColor(rgb: 0xffffff, alpha: 0.8), dateTextColor: UIColor(rgb: 0x8D8E93) ) diff --git a/TelegramUI/GenerateTextEntities.swift b/TelegramUI/GenerateTextEntities.swift index e11a9c47db..23bd36849a 100644 --- a/TelegramUI/GenerateTextEntities.swift +++ b/TelegramUI/GenerateTextEntities.swift @@ -21,6 +21,12 @@ private let identifierDelimiterSet: CharacterSet = { set.formUnion(CharacterSet.whitespacesAndNewlines) return set }() +private let externalIdentifierDelimiterSet: CharacterSet = { + var set = CharacterSet.punctuationCharacters + set.formUnion(CharacterSet.whitespacesAndNewlines) + set.remove(".") + return set +}() private enum CurrentEntityType { case command @@ -51,6 +57,7 @@ public struct EnabledEntityTypes: OptionSet { public static let hashtag = EnabledEntityTypes(rawValue: 1 << 2) public static let url = EnabledEntityTypes(rawValue: 1 << 3) public static let phoneNumber = EnabledEntityTypes(rawValue: 1 << 4) + public static let external = EnabledEntityTypes(rawValue: 1 << 5) public static let all: EnabledEntityTypes = [.command, .mention, .hashtag, .url, .phoneNumber] } @@ -113,6 +120,8 @@ public func generateTextEntities(_ text: String, enabledTypes: EnabledEntityType detector = dataDetector } + let delimiterSet = enabledTypes.contains(.external) ? externalIdentifierDelimiterSet : identifierDelimiterSet + if let detector = detector { detector.enumerateMatches(in: text, options: [], range: NSMakeRange(0, utf16.count), using: { result, _, _ in if let result = result { @@ -144,7 +153,7 @@ public func generateTextEntities(_ text: String, enabledTypes: EnabledEntityType if let scalar = scalar { if scalar == "/" { notFound = false - if previousScalar != nil && !identifierDelimiterSet.contains(previousScalar!) { + if previousScalar != nil && !delimiterSet.contains(previousScalar!) { currentEntity = nil } else { if let (type, range) = currentEntity { @@ -178,7 +187,7 @@ public func generateTextEntities(_ text: String, enabledTypes: EnabledEntityType case .command, .mention: if validIdentifierSet.contains(scalar) { currentEntity = (type, range.lowerBound ..< utf16.index(after: index)) - } else if identifierDelimiterSet.contains(scalar) { + } else if delimiterSet.contains(scalar) { if let (type, range) = currentEntity { commitEntity(utf16, type, range, enabledTypes, &entities) } @@ -187,7 +196,7 @@ public func generateTextEntities(_ text: String, enabledTypes: EnabledEntityType case .hashtag: if validHashtagSet.contains(scalar) { currentEntity = (type, range.lowerBound ..< utf16.index(after: index)) - } else if identifierDelimiterSet.contains(scalar) { + } else if delimiterSet.contains(scalar) { if let (type, range) = currentEntity { commitEntity(utf16, type, range, enabledTypes, &entities) } diff --git a/TelegramUI/HashtagSearchController.swift b/TelegramUI/HashtagSearchController.swift index 6d2967e416..f1e4a54c4e 100644 --- a/TelegramUI/HashtagSearchController.swift +++ b/TelegramUI/HashtagSearchController.swift @@ -88,6 +88,9 @@ final class HashtagSearchController: TelegramController { override func loadDisplayNode() { self.displayNode = HashtagSearchControllerNode(account: self.account, peer: self.peer, query: self.query, theme: self.presentationData.theme, strings: self.presentationData.strings) + if let chatController = self.controllerNode.chatController { + chatController.parentController = self + } self.displayNodeDidLoad() } diff --git a/TelegramUI/HashtagSearchControllerNode.swift b/TelegramUI/HashtagSearchControllerNode.swift index e1fe6c6810..2ea1bdc9b8 100644 --- a/TelegramUI/HashtagSearchControllerNode.swift +++ b/TelegramUI/HashtagSearchControllerNode.swift @@ -10,7 +10,7 @@ final class HashtagSearchControllerNode: ASDisplayNode { private let segmentedControl: UISegmentedControl let listNode: ListView - private var chatController: ChatController? + var chatController: ChatController? private let account: Account private let query: String diff --git a/TelegramUI/InstantImageGalleryItem.swift b/TelegramUI/InstantImageGalleryItem.swift index 48f063bc78..5d5678b7ed 100644 --- a/TelegramUI/InstantImageGalleryItem.swift +++ b/TelegramUI/InstantImageGalleryItem.swift @@ -128,7 +128,7 @@ final class InstantImageGalleryItemNode: ZoomableContentGalleryItemNode { if self.accountAndMedia == nil || !self.accountAndMedia!.1.media.isEqual(to: imageReference.media) { if let largestSize = largestRepresentationForPhoto(imageReference.media) { let displaySize = largestSize.dimensions.fitted(CGSize(width: 1280.0, height: 1280.0)).dividedByScreenScale().integralFloor - self.imageNode.asyncLayout()(TransformImageArguments(corners: ImageCorners(), imageSize: displaySize, boundingSize: displaySize, intrinsicInsets: UIEdgeInsets()))() + self.imageNode.asyncLayout()(TransformImageArguments(corners: ImageCorners(), imageSize: displaySize, boundingSize: displaySize, intrinsicInsets: UIEdgeInsets(), emptyColor: .black))() self.imageNode.setSignal(chatMessagePhoto(postbox: account.postbox, photoReference: imageReference), dispatchOnDisplayLink: false) self.zoomableContent = (largestSize.dimensions, self.imageNode) self.fetchDisposable.set(fetchedMediaResource(postbox: self.account.postbox, reference: imageReference.resourceReference(largestSize.resource)).start()) diff --git a/TelegramUI/InstantPageContentNode.swift b/TelegramUI/InstantPageContentNode.swift new file mode 100644 index 0000000000..8a0add9176 --- /dev/null +++ b/TelegramUI/InstantPageContentNode.swift @@ -0,0 +1,434 @@ +import Foundation +import AsyncDisplayKit +import Display +import Postbox +import TelegramCore +import SwiftSignalKit + +final class InstantPageContentNode : ASDisplayNode { + private let account: Account + private let strings: PresentationStrings + private let theme: InstantPageTheme + + private let openMedia: (InstantPageMedia) -> Void + private let openPeer: (PeerId) -> Void + private let openUrl: (InstantPageUrlItem) -> Void + + var currentLayoutTiles: [InstantPageTile] = [] + var currentLayoutItemsWithNodes: [InstantPageItem] = [] + var distanceThresholdGroupCount: [Int: Int] = [:] + + var visibleTiles: [Int: InstantPageTileNode] = [:] + var visibleItemsWithNodes: [Int: InstantPageNode] = [:] + + var currentWebEmbedHeights: [Int : CGFloat] = [:] + var currentExpandedDetails: [Int : Bool]? + var currentDetailsItems: [InstantPageDetailsItem] = [] + + var requestLayoutUpdate: ((Bool) -> Void)? + + var currentLayout: InstantPageLayout + let contentSize: CGSize + let inOverlayPanel: Bool + + private var previousVisibleBounds: CGRect? + + init(account: Account, strings: PresentationStrings, theme: InstantPageTheme, items: [InstantPageItem], contentSize: CGSize, inOverlayPanel: Bool = false, openMedia: @escaping (InstantPageMedia) -> Void, openPeer: @escaping (PeerId) -> Void, openUrl: @escaping (InstantPageUrlItem) -> Void) { + self.account = account + self.strings = strings + self.theme = theme + + self.openMedia = openMedia + self.openPeer = openPeer + self.openUrl = openUrl + + self.currentLayout = InstantPageLayout(origin: CGPoint(), contentSize: contentSize, items: items) + self.contentSize = contentSize + self.inOverlayPanel = inOverlayPanel + + super.init() + + self.updateLayout() + } + + private func updateLayout() { + for (_, tileNode) in self.visibleTiles { + tileNode.removeFromSupernode() + } + self.visibleTiles.removeAll() + + let currentLayoutTiles = instantPageTilesFromLayout(currentLayout, boundingWidth: contentSize.width) + + var currentDetailsItems: [InstantPageDetailsItem] = [] + var currentLayoutItemsWithViews: [InstantPageItem] = [] + var distanceThresholdGroupCount: [Int : Int] = [:] + + var expandedDetails: [Int : Bool] = [:] + + var detailsIndex = -1 + for item in self.currentLayout.items { + if item.wantsNode { + currentLayoutItemsWithViews.append(item) + if let group = item.distanceThresholdGroup() { + let count: Int + if let currentCount = distanceThresholdGroupCount[Int(group)] { + count = currentCount + } else { + count = 0 + } + distanceThresholdGroupCount[Int(group)] = count + 1 + } + if let detailsItem = item as? InstantPageDetailsItem { + detailsIndex += 1 + expandedDetails[detailsIndex] = detailsItem.initiallyExpanded + currentDetailsItems.append(detailsItem) + } + } + } + + if self.currentExpandedDetails == nil { + self.currentExpandedDetails = expandedDetails + } + + self.currentLayoutTiles = currentLayoutTiles + self.currentLayoutItemsWithNodes = currentLayoutItemsWithViews + self.currentDetailsItems = currentDetailsItems + self.distanceThresholdGroupCount = distanceThresholdGroupCount + } + + var effectiveContentSize: CGSize { + var contentSize = self.contentSize + for item in self.currentDetailsItems { + let expanded = self.currentExpandedDetails?[item.index] ?? item.initiallyExpanded + contentSize.height += -item.frame.height + (expanded ? self.effectiveSizeForDetails(item).height : item.titleHeight) + } + return contentSize + } + + func updateVisibleItems(visibleBounds: CGRect, animated: Bool = false) { + var visibleTileIndices = Set() + var visibleItemIndices = Set() + + self.previousVisibleBounds = visibleBounds + + var topNode: ASDisplayNode? + let topTileNode = topNode + if let scrollSubnodes = self.subnodes { + for node in scrollSubnodes.reversed() { + if let node = node as? InstantPageTileNode { + topNode = node + break + } + } + } + + var collapseOffset: CGFloat = 0.0 + let transition: ContainedViewLayoutTransition + if animated { + transition = .animated(duration: 0.3, curve: .spring) + } else { + transition = .immediate + } + + var itemIndex = -1 + var embedIndex = -1 + var detailsIndex = -1 + + for item in self.currentLayoutItemsWithNodes { + itemIndex += 1 + if item is InstantPageWebEmbedItem { + embedIndex += 1 + } + if item is InstantPageDetailsItem { + detailsIndex += 1 + } + + var itemThreshold: CGFloat = 0.0 + if let group = item.distanceThresholdGroup() { + var count: Int = 0 + if let currentCount = self.distanceThresholdGroupCount[group] { + count = currentCount + } + itemThreshold = item.distanceThresholdWithGroupCount(count) + } + + var itemFrame = item.frame.offsetBy(dx: 0.0, dy: -collapseOffset) + var thresholdedItemFrame = itemFrame + thresholdedItemFrame.origin.y -= itemThreshold + thresholdedItemFrame.size.height += itemThreshold * 2.0 + + if let detailsItem = item as? InstantPageDetailsItem, let expanded = self.currentExpandedDetails?[detailsIndex] { + let height = expanded ? self.effectiveSizeForDetails(detailsItem).height : detailsItem.titleHeight + collapseOffset += itemFrame.height - height + itemFrame = CGRect(origin: itemFrame.origin, size: CGSize(width: itemFrame.width, height: height)) + } + + if visibleBounds.intersects(thresholdedItemFrame) { + visibleItemIndices.insert(itemIndex) + + var itemNode = self.visibleItemsWithNodes[itemIndex] + if let currentItemNode = itemNode { + if !item.matchesNode(currentItemNode) { + (currentItemNode as! ASDisplayNode).removeFromSupernode() + self.visibleItemsWithNodes.removeValue(forKey: itemIndex) + itemNode = nil + } + } + + if itemNode == nil { + let itemIndex = itemIndex + let detailsIndex = detailsIndex + if let newNode = item.node(account: self.account, strings: self.strings, theme: theme, openMedia: { [weak self] media in + self?.openMedia(media) + }, openPeer: { [weak self] peerId in + self?.openPeer(peerId) + }, openUrl: { [weak self] url in + self?.openUrl(url) + }, updateWebEmbedHeight: { [weak self] height in + }, updateDetailsExpanded: { [weak self] expanded in + self?.updateDetailsExpanded(detailsIndex, expanded) + }, currentExpandedDetails: self.currentExpandedDetails) { + newNode.frame = itemFrame + newNode.updateLayout(size: itemFrame.size, transition: transition) + if let topNode = topNode { + self.insertSubnode(newNode, aboveSubnode: topNode) + } else { + self.insertSubnode(newNode, at: 0) + } + topNode = newNode + self.visibleItemsWithNodes[itemIndex] = newNode + itemNode = newNode + + if let itemNode = itemNode as? InstantPageDetailsNode { + itemNode.requestLayoutUpdate = { [weak self] animated in + self?.requestLayoutUpdate?(animated) + } + } + } + } else { + if (itemNode as! ASDisplayNode).frame != itemFrame { + transition.updateFrame(node: (itemNode as! ASDisplayNode), frame: itemFrame) + itemNode?.updateLayout(size: itemFrame.size, transition: transition) + } + } + + if let itemNode = itemNode as? InstantPageDetailsNode { + itemNode.updateVisibleItems(visibleBounds: visibleBounds.offsetBy(dx: -itemNode.frame.minX, dy: -itemNode.frame.minY), animated: animated) + } + } + } + + topNode = topTileNode + + var tileIndex = -1 + for tile in self.currentLayoutTiles { + tileIndex += 1 + + let tileFrame = effectiveFrameForTile(tile) + var tileVisibleFrame = tileFrame + tileVisibleFrame.origin.y -= 400.0 + tileVisibleFrame.size.height += 400.0 * 2.0 + if tileVisibleFrame.intersects(visibleBounds) { + visibleTileIndices.insert(tileIndex) + + if self.visibleTiles[tileIndex] == nil { + let tileNode = InstantPageTileNode(tile: tile, backgroundColor: self.inOverlayPanel ? self.theme.overlayPanelColor : self.theme.pageBackgroundColor) + tileNode.frame = tileFrame + if let topNode = topNode { + self.insertSubnode(tileNode, aboveSubnode: topNode) + } else { + self.insertSubnode(tileNode, at: 0) + } + topNode = tileNode + self.visibleTiles[tileIndex] = tileNode + } else { + if visibleTiles[tileIndex]!.frame != tileFrame { + transition.updateFrame(node: self.visibleTiles[tileIndex]!, frame: tileFrame) + } + } + } + } + + var removeTileIndices: [Int] = [] + for (index, tileNode) in self.visibleTiles { + if !visibleTileIndices.contains(index) { + removeTileIndices.append(index) + tileNode.removeFromSupernode() + } + } + for index in removeTileIndices { + self.visibleTiles.removeValue(forKey: index) + } + + var removeItemIndices: [Int] = [] + for (index, itemNode) in self.visibleItemsWithNodes { + if !visibleItemIndices.contains(index) { + removeItemIndices.append(index) + (itemNode as! ASDisplayNode).removeFromSupernode() + } else { + var itemFrame = (itemNode as! ASDisplayNode).frame + let itemThreshold: CGFloat = 200.0 + itemFrame.origin.y -= itemThreshold + itemFrame.size.height += itemThreshold * 2.0 + itemNode.updateIsVisible(visibleBounds.intersects(itemFrame)) + } + } + for index in removeItemIndices { + self.visibleItemsWithNodes.removeValue(forKey: index) + } + } + + private func updateWebEmbedHeight(_ index: Int, _ height: CGFloat) { + // let currentHeight = self.currentWebEmbedHeights[index] + // if height != currentHeight { + // if let currentHeight = currentHeight, currentHeight > height { + // return + // } + // self.currentWebEmbedHeights[index] = height + // + // let signal: Signal = (.complete() |> delay(0.08, queue: Queue.mainQueue())) + // self.updateLayoutDisposable.set(signal.start(completed: { [weak self] in + // if let strongSelf = self { + // strongSelf.updateLayout() + // strongSelf.updateVisibleItems() + // } + // })) + // } + } + + func updateDetailsExpanded(_ index: Int, _ expanded: Bool, animated: Bool = true, requestLayout: Bool = true) { + if var currentExpandedDetails = self.currentExpandedDetails { + currentExpandedDetails[index] = expanded + self.currentExpandedDetails = currentExpandedDetails + } + self.requestLayoutUpdate?(animated) + } + + func transitionNode(media: InstantPageMedia) -> (ASDisplayNode, () -> UIView?)? { + for (_, itemNode) in self.visibleItemsWithNodes { + if let transitionNode = itemNode.transitionNode(media: media) { + return transitionNode + } + } + return nil + } + + func updateHiddenMedia(media: InstantPageMedia?) { + for (_, itemNode) in self.visibleItemsWithNodes { + itemNode.updateHiddenMedia(media: media) + } + } + + func scrollableContentOffset(item: InstantPageScrollableItem) -> CGPoint { + var contentOffset = CGPoint() + for (_, itemNode) in self.visibleItemsWithNodes { + if let itemNode = itemNode as? InstantPageScrollableNode, itemNode.item === item { + contentOffset = itemNode.contentOffset + break + } + } + return contentOffset + } + + func nodeForDetailsItem(_ item: InstantPageDetailsItem) -> InstantPageDetailsNode? { + for (_, itemNode) in self.visibleItemsWithNodes { + if let detailsNode = itemNode as? InstantPageDetailsNode, detailsNode.item === item { + return detailsNode + } + } + return nil + } + + private func effectiveSizeForDetails(_ item: InstantPageDetailsItem) -> CGSize { + if let node = nodeForDetailsItem(item) { + return CGSize(width: item.frame.width, height: node.effectiveContentSize.height + item.titleHeight) + } else { + return item.frame.size + } + } + + private func effectiveFrameForTile(_ tile: InstantPageTile) -> CGRect { + let layoutOrigin = tile.frame.origin + var origin = layoutOrigin + for item in self.currentDetailsItems { + let expanded = self.currentExpandedDetails?[item.index] ?? item.initiallyExpanded + if layoutOrigin.y >= item.frame.maxY { + let height = expanded ? self.effectiveSizeForDetails(item).height : item.titleHeight + origin.y += height - item.frame.height + } + } + return CGRect(origin: origin, size: tile.frame.size) + } + + func effectiveFrameForItem(_ item: InstantPageItem) -> CGRect { + let layoutOrigin = item.frame.origin + var origin = layoutOrigin + + for item in self.currentDetailsItems { + let expanded = self.currentExpandedDetails?[item.index] ?? item.initiallyExpanded + if layoutOrigin.y >= item.frame.maxY { + let height = expanded ? self.effectiveSizeForDetails(item).height : item.titleHeight + origin.y += height - item.frame.height + } + } + + if let item = item as? InstantPageDetailsItem { + let expanded = self.currentExpandedDetails?[item.index] ?? item.initiallyExpanded + let height = expanded ? self.effectiveSizeForDetails(item).height : item.titleHeight + return CGRect(origin: origin, size: CGSize(width: item.frame.width, height: height)) + } else { + return CGRect(origin: origin, size: item.frame.size) + } + } + + func textItemAtLocation(_ location: CGPoint) -> (InstantPageTextItem, CGPoint)? { + for item in self.currentLayout.items { + let itemFrame = self.effectiveFrameForItem(item) + if itemFrame.contains(location) { + if let item = item as? InstantPageTextItem, item.selectable { + return (item, CGPoint(x: itemFrame.minX - item.frame.minX, y: itemFrame.minY - item.frame.minY)) + } else if let item = item as? InstantPageScrollableItem { + let contentOffset = scrollableContentOffset(item: item) + if let (textItem, parentOffset) = item.textItemAtLocation(location.offsetBy(dx: -itemFrame.minX + contentOffset.x, dy: -itemFrame.minY)) { + return (textItem, itemFrame.origin.offsetBy(dx: parentOffset.x - contentOffset.x, dy: parentOffset.y)) + } + } else if let item = item as? InstantPageDetailsItem { + for (_, itemNode) in self.visibleItemsWithNodes { + if let itemNode = itemNode as? InstantPageDetailsNode, itemNode.item === item { + if let (textItem, parentOffset) = itemNode.textItemAtLocation(location.offsetBy(dx: -itemFrame.minX, dy: -itemFrame.minY)) { + return (textItem, itemFrame.origin.offsetBy(dx: parentOffset.x, dy: parentOffset.y)) + } + } + } + } + } + } + return nil + } + + + func tapActionAtPoint(_ point: CGPoint) -> TapLongTapOrDoubleTapGestureRecognizerAction { + for item in self.currentLayout.items { + let frame = self.effectiveFrameForItem(item) + if frame.contains(point) { + if item is InstantPagePeerReferenceItem { + return .fail + } else if item is InstantPageAudioItem { + return .fail + } else if item is InstantPageArticleItem { + return .fail + } else if item is InstantPageFeedbackItem { + return .fail + } else if let item = item as? InstantPageDetailsItem { + for (_, itemNode) in self.visibleItemsWithNodes { + if let itemNode = itemNode as? InstantPageDetailsNode, itemNode.item === item { + return itemNode.tapActionAtPoint(point.offsetBy(dx: -itemNode.frame.minX, dy: -itemNode.frame.minY)) + } + } + } + break + } + } + return .waitForSingleTap + } +} diff --git a/TelegramUI/InstantPageController.swift b/TelegramUI/InstantPageController.swift index 12288aa469..3886201437 100644 --- a/TelegramUI/InstantPageController.swift +++ b/TelegramUI/InstantPageController.swift @@ -71,6 +71,10 @@ final class InstantPageController: ViewController { self.settingsDisposable?.dispose() } + override func viewWillDisappear(_ animated: Bool) { + let _ = updateInstantPageStoredStateInteractively(postbox: self.account.postbox, webPage: self.webPage, state: self.controllerNode.currentState).start() + } + override public func loadDisplayNode() { self.displayNode = InstantPageControllerNode(account: self.account, settings: self.settings, presentationTheme: self.presentationData.theme, strings: self.presentationData.strings, dateTimeFormat: self.presentationData.dateTimeFormat, statusBar: self.statusBar, getNavigationController: { [weak self] in return self?.navigationController as? NavigationController @@ -96,7 +100,12 @@ final class InstantPageController: ViewController { self.displayNodeDidLoad() - self.controllerNode.updateWebPage(self.webPage, anchor: self.anchor) + let _ = (instantPageStoredState(postbox: self.account.postbox, webPage: self.webPage) + |> deliverOnMainQueue).start(next: { [weak self] state in + if let strongSelf = self { + strongSelf.controllerNode.updateWebPage(strongSelf.webPage, anchor: strongSelf.anchor, state: state) + } + }) } override public func containerLayoutUpdated(_ layout: ContainerViewLayout, transition: ContainedViewLayoutTransition) { diff --git a/TelegramUI/InstantPageControllerNode.swift b/TelegramUI/InstantPageControllerNode.swift index 0c31b4abed..fa4daeeacc 100644 --- a/TelegramUI/InstantPageControllerNode.swift +++ b/TelegramUI/InstantPageControllerNode.swift @@ -22,6 +22,7 @@ final class InstantPageControllerNode: ASDisplayNode, UIScrollViewDelegate { private var webPage: TelegramMediaWebpage? private var initialAnchor: String? private var pendingAnchor: String? + private var initialState: InstantPageStoredState? private var containerLayout: ContainerViewLayout? private var setupScrollOffsetOnLayout: Bool = false @@ -62,6 +63,16 @@ final class InstantPageControllerNode: ASDisplayNode, UIScrollViewDelegate { private var themeReferenceDate: Date? + var currentState: InstantPageStoredState { + var details: [InstantPageStoredDetailsState] = [] + if let currentExpandedDetails = self.currentExpandedDetails { + for (index, expanded) in currentExpandedDetails { + details.append(InstantPageStoredDetailsState(index: Int32(clamping: index), expanded: expanded, details: [])) + } + } + return InstantPageStoredState(contentOffset: Double(self.scrollNode.view.contentOffset.y), details: details) + } + init(account: Account, settings: InstantPagePresentationSettings?, presentationTheme: PresentationTheme, strings: PresentationStrings, dateTimeFormat: PresentationDateTimeFormat, statusBar: StatusBar, getNavigationController: @escaping () -> NavigationController?, present: @escaping (ViewController, Any?) -> Void, pushController: @escaping (ViewController) -> Void, openPeer: @escaping (PeerId) -> Void, navigateBack: @escaping () -> Void) { self.account = account self.presentationTheme = presentationTheme @@ -246,7 +257,7 @@ final class InstantPageControllerNode: ASDisplayNode, UIScrollViewDelegate { self.scrollNode.view.addGestureRecognizer(recognizer) } - func updateWebPage(_ webPage: TelegramMediaWebpage?, anchor: String?) { + func updateWebPage(_ webPage: TelegramMediaWebpage?, anchor: String?, state: InstantPageStoredState? = nil) { if self.webPage != webPage { if self.webPage != nil && self.currentLayout != nil { if let snaphotView = self.scrollNode.view.snapshotView(afterScreenUpdates: false) { @@ -259,8 +270,18 @@ final class InstantPageControllerNode: ASDisplayNode, UIScrollViewDelegate { self.setupScrollOffsetOnLayout = self.webPage == nil self.webPage = webPage - self.initialAnchor = anchor?.removingPercentEncoding - + if let anchor = anchor { + self.initialAnchor = anchor.removingPercentEncoding + } else if let state = state { + self.initialState = state + if !state.details.isEmpty { + var storedExpandedDetails: [Int: Bool] = [:] + for state in state.details { + storedExpandedDetails[Int(clamping: state.index)] = state.expanded + } + self.currentExpandedDetails = storedExpandedDetails + } + } self.currentLayout = nil self.updateLayout() @@ -317,14 +338,15 @@ final class InstantPageControllerNode: ASDisplayNode, UIScrollViewDelegate { } if resetOffset { var contentOffset = CGPoint(x: 0.0, y: -self.scrollNode.view.contentInset.top) - if let anchor = self.initialAnchor, !anchor.isEmpty { + if let state = self.initialState { + self.setupScrollOffsetOnLayout = false + contentOffset = CGPoint(x: 0.0, y: CGFloat(state.contentOffset)) + } + else if let anchor = self.initialAnchor, !anchor.isEmpty { if let items = self.currentLayout?.items { self.setupScrollOffsetOnLayout = false - outer: for item in items { - if let item = item as? InstantPageAnchorItem, item.anchor == anchor { - contentOffset = CGPoint(x: 0.0, y: item.frame.origin.y - self.scrollNode.view.contentInset.top) - break outer - } + if let (item, lineOffset, detailsItems) = self.findAnchorItem(anchor, items: items) { + contentOffset = CGPoint(x: 0.0, y: item.frame.minY - self.scrollNode.view.contentInset.top) } } } else { @@ -702,11 +724,11 @@ final class InstantPageControllerNode: ASDisplayNode, UIScrollViewDelegate { var rects: [CGRect]? if let location = location, let currentLayout = self.currentLayout { for item in currentLayout.items { - let itemFrame = effectiveFrameForItem(item) + let itemFrame = self.effectiveFrameForItem(item) if itemFrame.contains(location) { var contentOffset = CGPoint() if let item = item as? InstantPageScrollableItem { - contentOffset = scrollableContentOffset(item: item) + contentOffset = self.scrollableContentOffset(item: item) } var itemRects = item.linkSelectionRects(at: location.offsetBy(dx: -itemFrame.minX + contentOffset.x, dy: -itemFrame.minY)) @@ -848,10 +870,10 @@ final class InstantPageControllerNode: ASDisplayNode, UIScrollViewDelegate { self.openUrl(url) } case .longTap: - if let url = self.urlForTapLocation(location) { + if let theme = self.theme, let url = self.urlForTapLocation(location) { let canOpenIn = availableOpenInOptions(applicationContext: self.account.telegramApplicationContext, item: .url(url: url.url)).count > 1 let openText = canOpenIn ? self.strings.Conversation_FileOpenIn : self.strings.Conversation_LinkDialogOpen - let actionSheet = ActionSheetController(presentationTheme: self.presentationTheme) + let actionSheet = ActionSheetController(instantPageTheme: theme) actionSheet.setItemGroups([ActionSheetItemGroup(items: [ ActionSheetTextItem(title: url.url), ActionSheetButtonItem(title: openText, color: .accent, action: { [weak self, weak actionSheet] in @@ -968,7 +990,16 @@ final class InstantPageControllerNode: ASDisplayNode, UIScrollViewDelegate { } private func presentReferenceView(item: InstantPageTextItem) { - let controller = InstantPageReferenceController(account: self.account, item: item) + guard let theme = self.theme, let webPage = self.webPage else { + return + } + let controller = InstantPageReferenceController(account: self.account, theme: theme, webPage: webPage, item: item, openUrl: { [weak self] url in + self?.openUrl(url) + }, openUrlIn: { [weak self] url in + self?.openUrlIn(url) + }, present: { [weak self] c, a in + self?.present(c, a) + }) self.present(controller, nil) } @@ -979,40 +1010,44 @@ final class InstantPageControllerNode: ASDisplayNode, UIScrollViewDelegate { if !anchor.isEmpty { if let (item, lineOffset, detailsItems) = findAnchorItem(String(anchor), items: items) { - var previousDetailsNode: InstantPageDetailsNode? - var containerOffset: CGFloat = 0.0 - for detailsItem in detailsItems { - if let previousNode = previousDetailsNode { - previousNode.contentNode.updateDetailsExpanded(detailsItem.index, true, animated: false) - let frame = previousNode.effectiveFrameForItem(detailsItem) - containerOffset += frame.minY - - previousDetailsNode = previousNode.contentNode.nodeForDetailsItem(detailsItem) - previousDetailsNode?.setExpanded(true, animated: false) - } else { - self.updateDetailsExpanded(detailsItem.index, true, animated: false) - let frame = self.effectiveFrameForItem(detailsItem) - containerOffset += frame.minY - - previousDetailsNode = self.nodeForDetailsItem(detailsItem) - previousDetailsNode?.setExpanded(true, animated: false) + if let item = item as? InstantPageTextItem, item.plainText().count > 1 { + self.presentReferenceView(item: item) + } else { + var previousDetailsNode: InstantPageDetailsNode? + var containerOffset: CGFloat = 0.0 + for detailsItem in detailsItems { + if let previousNode = previousDetailsNode { + previousNode.contentNode.updateDetailsExpanded(detailsItem.index, true, animated: false) + let frame = previousNode.effectiveFrameForItem(detailsItem) + containerOffset += frame.minY + + previousDetailsNode = previousNode.contentNode.nodeForDetailsItem(detailsItem) + previousDetailsNode?.setExpanded(true, animated: false) + } else { + self.updateDetailsExpanded(detailsItem.index, true, animated: false) + let frame = self.effectiveFrameForItem(detailsItem) + containerOffset += frame.minY + + previousDetailsNode = self.nodeForDetailsItem(detailsItem) + previousDetailsNode?.setExpanded(true, animated: false) + } } + + let frame: CGRect + if let previousDetailsNode = previousDetailsNode { + frame = previousDetailsNode.effectiveFrameForItem(item) + } else { + frame = self.effectiveFrameForItem(item) + } + + var targetY = min(containerOffset + frame.minY + lineOffset, self.scrollNode.view.contentSize.height - self.scrollNode.frame.height) + if targetY < self.scrollNode.view.contentOffset.y { + targetY -= self.scrollNode.view.contentInset.top + } else { + targetY -= self.containerLayout?.statusBarHeight ?? 20.0 + } + self.scrollNode.view.setContentOffset(CGPoint(x: 0.0, y: targetY), animated: true) } - - let frame: CGRect - if let previousDetailsNode = previousDetailsNode { - frame = previousDetailsNode.effectiveFrameForItem(item) - } else { - frame = self.effectiveFrameForItem(item) - } - - var targetY = min(containerOffset + frame.minY + lineOffset, self.scrollNode.view.contentSize.height - self.scrollNode.frame.height) - if targetY < self.scrollNode.view.contentOffset.y { - targetY -= self.scrollNode.view.contentInset.top - } else { - targetY -= self.containerLayout?.statusBarHeight ?? 20.0 - } - self.scrollNode.view.setContentOffset(CGPoint(x: 0.0, y: targetY), animated: true) } else if let webPage = self.webPage, case let .Loaded(content) = webPage.content, let instantPage = content.instantPage, !instantPage.isComplete { self.loadProgress.set(0.5) self.pendingAnchor = anchor @@ -1037,14 +1072,11 @@ final class InstantPageControllerNode: ASDisplayNode, UIScrollViewDelegate { self.loadProgress.set(0.0) self.loadProgress.set(0.02) - let resolveSignal = resolveUrl(account: self.account, url: url.url) - |> afterCompleted { [weak self] in - self?.loadProgress.set(0.07) - } - + self.loadWebpageDisposable.set(nil) - self.resolveUrlDisposable.set((resolveSignal |> deliverOnMainQueue).start(next: { [weak self] result in + self.resolveUrlDisposable.set((resolveUrl(account: self.account, url: url.url) |> deliverOnMainQueue).start(next: { [weak self] result in if let strongSelf = self { + strongSelf.loadProgress.set(0.07) switch result { case let .externalUrl(externalUrl): if let webpageId = url.webpageId { @@ -1068,11 +1100,13 @@ final class InstantPageControllerNode: ASDisplayNode, UIScrollViewDelegate { } })) } else { + strongSelf.loadProgress.set(1.0) openExternalUrl(account: strongSelf.account, url: externalUrl, presentationData: strongSelf.account.telegramApplicationContext.currentPresentationData.with { $0 }, applicationContext: strongSelf.account.telegramApplicationContext, navigationController: strongSelf.getNavigationController(), dismissInput: { self?.view.endEditing(true) }) } default: + strongSelf.loadProgress.set(1.0) openResolvedUrl(result, account: strongSelf.account, navigationController: strongSelf.getNavigationController(), openPeer: { peerId, navigation in switch navigation { case let .chat(_, messageId): diff --git a/TelegramUI/InstantPageDetailsNode.swift b/TelegramUI/InstantPageDetailsNode.swift index 3c8a494c83..992c0973dd 100644 --- a/TelegramUI/InstantPageDetailsNode.swift +++ b/TelegramUI/InstantPageDetailsNode.swift @@ -8,432 +8,6 @@ import SwiftSignalKit private let detailsInset: CGFloat = 17.0 private let titleInset: CGFloat = 22.0 -final class InstantPageDetailsContentNode : ASDisplayNode { - private let account: Account - private let strings: PresentationStrings - private let theme: InstantPageTheme - - private let openMedia: (InstantPageMedia) -> Void - private let openPeer: (PeerId) -> Void - private let openUrl: (InstantPageUrlItem) -> Void - - var currentLayoutTiles: [InstantPageTile] = [] - var currentLayoutItemsWithNodes: [InstantPageItem] = [] - var distanceThresholdGroupCount: [Int: Int] = [:] - - var visibleTiles: [Int: InstantPageTileNode] = [:] - var visibleItemsWithNodes: [Int: InstantPageNode] = [:] - - var currentWebEmbedHeights: [Int : CGFloat] = [:] - var currentExpandedDetails: [Int : Bool]? - var currentDetailsItems: [InstantPageDetailsItem] = [] - - var requestLayoutUpdate: ((Bool) -> Void)? - - var currentLayout: InstantPageLayout - let contentSize: CGSize - - private var previousVisibleBounds: CGRect? - - init(account: Account, strings: PresentationStrings, theme: InstantPageTheme, items: [InstantPageItem], contentSize: CGSize, openMedia: @escaping (InstantPageMedia) -> Void, openPeer: @escaping (PeerId) -> Void, openUrl: @escaping (InstantPageUrlItem) -> Void) { - self.account = account - self.strings = strings - self.theme = theme - - self.openMedia = openMedia - self.openPeer = openPeer - self.openUrl = openUrl - - self.currentLayout = InstantPageLayout(origin: CGPoint(), contentSize: contentSize, items: items) - self.contentSize = contentSize - - super.init() - - self.updateLayout() - } - - private func updateLayout() { - for (_, tileNode) in self.visibleTiles { - tileNode.removeFromSupernode() - } - self.visibleTiles.removeAll() - - let currentLayoutTiles = instantPageTilesFromLayout(currentLayout, boundingWidth: contentSize.width) - - var currentDetailsItems: [InstantPageDetailsItem] = [] - var currentLayoutItemsWithViews: [InstantPageItem] = [] - var distanceThresholdGroupCount: [Int : Int] = [:] - - var expandedDetails: [Int : Bool] = [:] - - var detailsIndex = -1 - for item in self.currentLayout.items { - if item.wantsNode { - currentLayoutItemsWithViews.append(item) - if let group = item.distanceThresholdGroup() { - let count: Int - if let currentCount = distanceThresholdGroupCount[Int(group)] { - count = currentCount - } else { - count = 0 - } - distanceThresholdGroupCount[Int(group)] = count + 1 - } - if let detailsItem = item as? InstantPageDetailsItem { - detailsIndex += 1 - expandedDetails[detailsIndex] = detailsItem.initiallyExpanded - currentDetailsItems.append(detailsItem) - } - } - } - - if self.currentExpandedDetails == nil { - self.currentExpandedDetails = expandedDetails - } - - self.currentLayoutTiles = currentLayoutTiles - self.currentLayoutItemsWithNodes = currentLayoutItemsWithViews - self.currentDetailsItems = currentDetailsItems - self.distanceThresholdGroupCount = distanceThresholdGroupCount - } - - var effectiveContentSize: CGSize { - var contentSize = self.contentSize - for item in self.currentDetailsItems { - let expanded = self.currentExpandedDetails?[item.index] ?? item.initiallyExpanded - contentSize.height += -item.frame.height + (expanded ? self.effectiveSizeForDetails(item).height : item.titleHeight) - } - return contentSize - } - - func updateVisibleItems(visibleBounds: CGRect, animated: Bool = false) { - var visibleTileIndices = Set() - var visibleItemIndices = Set() - - self.previousVisibleBounds = visibleBounds - - var topNode: ASDisplayNode? - let topTileNode = topNode - if let scrollSubnodes = self.subnodes { - for node in scrollSubnodes.reversed() { - if let node = node as? InstantPageTileNode { - topNode = node - break - } - } - } - - var collapseOffset: CGFloat = 0.0 - let transition: ContainedViewLayoutTransition - if animated { - transition = .animated(duration: 0.3, curve: .spring) - } else { - transition = .immediate - } - - var itemIndex = -1 - var embedIndex = -1 - var detailsIndex = -1 - - for item in self.currentLayoutItemsWithNodes { - itemIndex += 1 - if item is InstantPageWebEmbedItem { - embedIndex += 1 - } - if item is InstantPageDetailsItem { - detailsIndex += 1 - } - - var itemThreshold: CGFloat = 0.0 - if let group = item.distanceThresholdGroup() { - var count: Int = 0 - if let currentCount = self.distanceThresholdGroupCount[group] { - count = currentCount - } - itemThreshold = item.distanceThresholdWithGroupCount(count) - } - - var itemFrame = item.frame.offsetBy(dx: 0.0, dy: -collapseOffset) - var thresholdedItemFrame = itemFrame - thresholdedItemFrame.origin.y -= itemThreshold - thresholdedItemFrame.size.height += itemThreshold * 2.0 - - if let detailsItem = item as? InstantPageDetailsItem, let expanded = self.currentExpandedDetails?[detailsIndex] { - let height = expanded ? self.effectiveSizeForDetails(detailsItem).height : detailsItem.titleHeight - collapseOffset += itemFrame.height - height - itemFrame = CGRect(origin: itemFrame.origin, size: CGSize(width: itemFrame.width, height: height)) - } - - if visibleBounds.intersects(thresholdedItemFrame) { - visibleItemIndices.insert(itemIndex) - - var itemNode = self.visibleItemsWithNodes[itemIndex] - if let currentItemNode = itemNode { - if !item.matchesNode(currentItemNode) { - (currentItemNode as! ASDisplayNode).removeFromSupernode() - self.visibleItemsWithNodes.removeValue(forKey: itemIndex) - itemNode = nil - } - } - - if itemNode == nil { - let itemIndex = itemIndex - let detailsIndex = detailsIndex - if let newNode = item.node(account: self.account, strings: self.strings, theme: theme, openMedia: { [weak self] media in - self?.openMedia(media) - }, openPeer: { [weak self] peerId in - self?.openPeer(peerId) - }, openUrl: { [weak self] url in - self?.openUrl(url) - }, updateWebEmbedHeight: { [weak self] height in - }, updateDetailsExpanded: { [weak self] expanded in - self?.updateDetailsExpanded(detailsIndex, expanded) - }, currentExpandedDetails: self.currentExpandedDetails) { - newNode.frame = itemFrame - newNode.updateLayout(size: itemFrame.size, transition: transition) - if let topNode = topNode { - self.insertSubnode(newNode, aboveSubnode: topNode) - } else { - self.insertSubnode(newNode, at: 0) - } - topNode = newNode - self.visibleItemsWithNodes[itemIndex] = newNode - itemNode = newNode - - if let itemNode = itemNode as? InstantPageDetailsNode { - itemNode.requestLayoutUpdate = { [weak self] animated in - self?.requestLayoutUpdate?(animated) - } - } - } - } else { - if (itemNode as! ASDisplayNode).frame != itemFrame { - transition.updateFrame(node: (itemNode as! ASDisplayNode), frame: itemFrame) - itemNode?.updateLayout(size: itemFrame.size, transition: transition) - } - } - - if let itemNode = itemNode as? InstantPageDetailsNode { - itemNode.updateVisibleItems(visibleBounds: visibleBounds.offsetBy(dx: -itemNode.frame.minX, dy: -itemNode.frame.minY), animated: animated) - } - } - } - - topNode = topTileNode - - var tileIndex = -1 - for tile in self.currentLayoutTiles { - tileIndex += 1 - - let tileFrame = effectiveFrameForTile(tile) - var tileVisibleFrame = tileFrame - tileVisibleFrame.origin.y -= 400.0 - tileVisibleFrame.size.height += 400.0 * 2.0 - if tileVisibleFrame.intersects(visibleBounds) { - visibleTileIndices.insert(tileIndex) - - if self.visibleTiles[tileIndex] == nil { - let tileNode = InstantPageTileNode(tile: tile, backgroundColor: theme.pageBackgroundColor) - tileNode.frame = tileFrame - if let topNode = topNode { - self.insertSubnode(tileNode, aboveSubnode: topNode) - } else { - self.insertSubnode(tileNode, at: 0) - } - topNode = tileNode - self.visibleTiles[tileIndex] = tileNode - } else { - if visibleTiles[tileIndex]!.frame != tileFrame { - transition.updateFrame(node: self.visibleTiles[tileIndex]!, frame: tileFrame) - } - } - } - } - - var removeTileIndices: [Int] = [] - for (index, tileNode) in self.visibleTiles { - if !visibleTileIndices.contains(index) { - removeTileIndices.append(index) - tileNode.removeFromSupernode() - } - } - for index in removeTileIndices { - self.visibleTiles.removeValue(forKey: index) - } - - var removeItemIndices: [Int] = [] - for (index, itemNode) in self.visibleItemsWithNodes { - if !visibleItemIndices.contains(index) { - removeItemIndices.append(index) - (itemNode as! ASDisplayNode).removeFromSupernode() - } else { - var itemFrame = (itemNode as! ASDisplayNode).frame - let itemThreshold: CGFloat = 200.0 - itemFrame.origin.y -= itemThreshold - itemFrame.size.height += itemThreshold * 2.0 - itemNode.updateIsVisible(visibleBounds.intersects(itemFrame)) - } - } - for index in removeItemIndices { - self.visibleItemsWithNodes.removeValue(forKey: index) - } - } - - private func updateWebEmbedHeight(_ index: Int, _ height: CGFloat) { -// let currentHeight = self.currentWebEmbedHeights[index] -// if height != currentHeight { -// if let currentHeight = currentHeight, currentHeight > height { -// return -// } -// self.currentWebEmbedHeights[index] = height -// -// let signal: Signal = (.complete() |> delay(0.08, queue: Queue.mainQueue())) -// self.updateLayoutDisposable.set(signal.start(completed: { [weak self] in -// if let strongSelf = self { -// strongSelf.updateLayout() -// strongSelf.updateVisibleItems() -// } -// })) -// } - } - - func updateDetailsExpanded(_ index: Int, _ expanded: Bool, animated: Bool = true, requestLayout: Bool = true) { - if var currentExpandedDetails = self.currentExpandedDetails { - currentExpandedDetails[index] = expanded - self.currentExpandedDetails = currentExpandedDetails - } - self.requestLayoutUpdate?(animated) - } - - func transitionNode(media: InstantPageMedia) -> (ASDisplayNode, () -> UIView?)? { - for (_, itemNode) in self.visibleItemsWithNodes { - if let transitionNode = itemNode.transitionNode(media: media) { - return transitionNode - } - } - return nil - } - - func updateHiddenMedia(media: InstantPageMedia?) { - for (_, itemNode) in self.visibleItemsWithNodes { - itemNode.updateHiddenMedia(media: media) - } - } - - private func scrollableContentOffset(item: InstantPageScrollableItem) -> CGPoint { - var contentOffset = CGPoint() - for (_, itemNode) in self.visibleItemsWithNodes { - if let itemNode = itemNode as? InstantPageScrollableNode, itemNode.item === item { - contentOffset = itemNode.contentOffset - break - } - } - return contentOffset - } - - func nodeForDetailsItem(_ item: InstantPageDetailsItem) -> InstantPageDetailsNode? { - for (_, itemNode) in self.visibleItemsWithNodes { - if let detailsNode = itemNode as? InstantPageDetailsNode, detailsNode.item === item { - return detailsNode - } - } - return nil - } - - private func effectiveSizeForDetails(_ item: InstantPageDetailsItem) -> CGSize { - if let node = nodeForDetailsItem(item) { - return CGSize(width: item.frame.width, height: node.effectiveContentSize.height + item.titleHeight) - } else { - return item.frame.size - } - } - - private func effectiveFrameForTile(_ tile: InstantPageTile) -> CGRect { - let layoutOrigin = tile.frame.origin - var origin = layoutOrigin - for item in self.currentDetailsItems { - let expanded = self.currentExpandedDetails?[item.index] ?? item.initiallyExpanded - if layoutOrigin.y >= item.frame.maxY { - let height = expanded ? self.effectiveSizeForDetails(item).height : item.titleHeight - origin.y += height - item.frame.height - } - } - return CGRect(origin: origin, size: tile.frame.size) - } - - fileprivate func effectiveFrameForItem(_ item: InstantPageItem) -> CGRect { - let layoutOrigin = item.frame.origin - var origin = layoutOrigin - - for item in self.currentDetailsItems { - let expanded = self.currentExpandedDetails?[item.index] ?? item.initiallyExpanded - if layoutOrigin.y >= item.frame.maxY { - let height = expanded ? self.effectiveSizeForDetails(item).height : item.titleHeight - origin.y += height - item.frame.height - } - } - - if let item = item as? InstantPageDetailsItem { - let expanded = self.currentExpandedDetails?[item.index] ?? item.initiallyExpanded - let height = expanded ? self.effectiveSizeForDetails(item).height : item.titleHeight - return CGRect(origin: origin, size: CGSize(width: item.frame.width, height: height)) - } else { - return CGRect(origin: origin, size: item.frame.size) - } - } - - func textItemAtLocation(_ location: CGPoint) -> (InstantPageTextItem, CGPoint)? { - for item in self.currentLayout.items { - let itemFrame = self.effectiveFrameForItem(item) - if itemFrame.contains(location) { - if let item = item as? InstantPageTextItem, item.selectable { - return (item, CGPoint(x: itemFrame.minX - item.frame.minX, y: itemFrame.minY - item.frame.minY)) - } else if let item = item as? InstantPageScrollableItem { - let contentOffset = scrollableContentOffset(item: item) - if let (textItem, parentOffset) = item.textItemAtLocation(location.offsetBy(dx: -itemFrame.minX + contentOffset.x, dy: -itemFrame.minY)) { - return (textItem, itemFrame.origin.offsetBy(dx: parentOffset.x - contentOffset.x, dy: parentOffset.y)) - } - } else if let item = item as? InstantPageDetailsItem { - for (_, itemNode) in self.visibleItemsWithNodes { - if let itemNode = itemNode as? InstantPageDetailsNode, itemNode.item === item { - if let (textItem, parentOffset) = itemNode.textItemAtLocation(location.offsetBy(dx: -itemFrame.minX, dy: -itemFrame.minY)) { - return (textItem, itemFrame.origin.offsetBy(dx: parentOffset.x, dy: parentOffset.y)) - } - } - } - } - } - } - return nil - } - - - func tapActionAtPoint(_ point: CGPoint) -> TapLongTapOrDoubleTapGestureRecognizerAction { - for item in self.currentLayout.items { - let frame = self.effectiveFrameForItem(item) - if frame.contains(point) { - if item is InstantPagePeerReferenceItem { - return .fail - } else if item is InstantPageAudioItem { - return .fail - } else if item is InstantPageArticleItem { - return .fail - } else if item is InstantPageFeedbackItem { - return .fail - } else if let item = item as? InstantPageDetailsItem { - for (_, itemNode) in self.visibleItemsWithNodes { - if let itemNode = itemNode as? InstantPageDetailsNode, itemNode.item === item { - return itemNode.tapActionAtPoint(point.offsetBy(dx: -itemNode.frame.minX, dy: -itemNode.frame.minY)) - } - } - } - break - } - } - return .waitForSingleTap - } -} - final class InstantPageDetailsNode: ASDisplayNode, InstantPageNode { private let account: Account private let strings: PresentationStrings @@ -447,7 +21,7 @@ final class InstantPageDetailsNode: ASDisplayNode, InstantPageNode { private let buttonNode: HighlightableButtonNode private let arrowNode: InstantPageDetailsArrowNode let separatorNode: ASDisplayNode - let contentNode: InstantPageDetailsContentNode + let contentNode: InstantPageContentNode private let updateExpanded: (Bool) -> Void var expanded: Bool @@ -485,7 +59,7 @@ final class InstantPageDetailsNode: ASDisplayNode, InstantPageNode { self.arrowNode = InstantPageDetailsArrowNode(color: theme.controlColor, open: self.expanded) self.separatorNode = ASDisplayNode() - self.contentNode = InstantPageDetailsContentNode(account: account, strings: strings, theme: theme, items: item.items, contentSize: CGSize(width: item.frame.width, height: item.frame.height - item.titleHeight), openMedia: openMedia, openPeer: openPeer, openUrl: openUrl) + self.contentNode = InstantPageContentNode(account: account, strings: strings, theme: theme, items: item.items, contentSize: CGSize(width: item.frame.width, height: item.frame.height - item.titleHeight), openMedia: openMedia, openPeer: openPeer, openUrl: openUrl) super.init() diff --git a/TelegramUI/InstantPageImageNode.swift b/TelegramUI/InstantPageImageNode.swift index c5258734cc..17022638f5 100644 --- a/TelegramUI/InstantPageImageNode.swift +++ b/TelegramUI/InstantPageImageNode.swift @@ -23,7 +23,9 @@ final class InstantPageImageNode: ASDisplayNode, InstantPageNode { private var currentSize: CGSize? + private var fetchStatus: MediaResourceStatus? private var fetchedDisposable = MetaDisposable() + private var statusDisposable = MetaDisposable() private var themeUpdated: Bool = false @@ -47,15 +49,26 @@ final class InstantPageImageNode: ASDisplayNode, InstantPageNode { self.addSubnode(self.imageNode) - if let image = media.media as? TelegramMediaImage { + if let image = media.media as? TelegramMediaImage, let largest = largestImageRepresentation(image.representations) { let imageReference = ImageMediaReference.webPage(webPage: WebpageReference(webPage), media: image) self.imageNode.setSignal(chatMessagePhoto(postbox: account.postbox, photoReference: imageReference)) self.fetchedDisposable.set(chatMessagePhotoInteractiveFetched(account: account, photoReference: imageReference, storeToDownloadsPeerType: nil).start()) + self.statusDisposable.set((account.postbox.mediaBox.resourceStatus(largest.resource) |> deliverOnMainQueue).start(next: { [weak self] status in + displayLinkDispatcher.dispatch { + if let strongSelf = self { + strongSelf.fetchStatus = status + strongSelf.updateFetchStatus() + } + } + })) + if media.url != nil { self.linkIconNode.image = UIImage(bundleImageName: "Instant View/ImageLink") self.addSubnode(self.linkIconNode) } + + self.addSubnode(self.statusNode) } else if let file = media.media as? TelegramMediaFile { let fileReference = FileMediaReference.webPage(webPage: WebpageReference(webPage), media: file) if file.mimeType.hasPrefix("image/") { @@ -68,7 +81,7 @@ final class InstantPageImageNode: ASDisplayNode, InstantPageNode { self.addSubnode(self.pinNode) var zoom: Int32 = 12 - var dimensions = CGSize(width: 200, height: 100) + var dimensions = CGSize(width: 200.0, height: 100.0) for attribute in self.attributes { if let mapAttribute = attribute as? InstantPageMapAttribute { zoom = mapAttribute.zoom @@ -83,12 +96,13 @@ final class InstantPageImageNode: ASDisplayNode, InstantPageNode { self.imageNode.setSignal(chatMessagePhoto(postbox: account.postbox, photoReference: imageReference)) self.fetchedDisposable.set(chatMessagePhotoInteractiveFetched(account: account, photoReference: imageReference, storeToDownloadsPeerType: nil).start()) self.statusNode.transitionToState(.play(.white), animated: false, completion: {}) - self.addSubnode(statusNode) + self.addSubnode(self.statusNode) } } deinit { self.fetchedDisposable.dispose() + self.statusDisposable.dispose() } override func didLoad() { @@ -115,6 +129,27 @@ final class InstantPageImageNode: ASDisplayNode, InstantPageNode { } } + private func updateFetchStatus() { + var state: RadialStatusNodeState = .none + if let fetchStatus = self.fetchStatus { + switch fetchStatus { + case let .Fetching(isActive, progress): + var adjustedProgress = progress + if isActive { + adjustedProgress = max(adjustedProgress, 0.027) + } + state = .progress(color: .white, lineWidth: nil, value: CGFloat(adjustedProgress), cancelEnabled: false) + default: + break + } + } + self.statusNode.transitionToState(state, completion: { [weak statusNode] in + if state == .none { + statusNode?.removeFromSupernode() + } + }) + } + override func layout() { super.layout() @@ -126,12 +161,15 @@ final class InstantPageImageNode: ASDisplayNode, InstantPageNode { self.imageNode.frame = CGRect(origin: CGPoint(), size: size) + let radialStatusSize: CGFloat = 50.0 + self.statusNode.frame = CGRect(x: floorToScreenPixels((size.width - radialStatusSize) / 2.0), y: floorToScreenPixels((size.height - radialStatusSize) / 2.0), width: radialStatusSize, height: radialStatusSize) + if let image = self.media.media as? TelegramMediaImage, let largest = largestImageRepresentation(image.representations) { let imageSize = largest.dimensions.aspectFilled(size) let boundingSize = size let radius: CGFloat = self.roundCorners ? floor(min(imageSize.width, imageSize.height) / 2.0) : 0.0 let makeLayout = self.imageNode.asyncLayout() - let apply = makeLayout(TransformImageArguments(corners: ImageCorners(radius: radius), imageSize: imageSize, boundingSize: boundingSize, intrinsicInsets: UIEdgeInsets(), emptyColor: self.theme.pageBackgroundColor)) + let apply = makeLayout(TransformImageArguments(corners: ImageCorners(radius: radius), imageSize: imageSize, boundingSize: boundingSize, intrinsicInsets: UIEdgeInsets(), emptyColor: self.theme.panelBackgroundColor)) apply() self.linkIconNode.frame = CGRect(x: size.width - 38.0, y: 14.0, width: 24.0, height: 24.0) @@ -168,9 +206,6 @@ final class InstantPageImageNode: ASDisplayNode, InstantPageNode { let makeLayout = self.imageNode.asyncLayout() let apply = makeLayout(TransformImageArguments(corners: ImageCorners(radius: radius), imageSize: imageSize, boundingSize: boundingSize, intrinsicInsets: UIEdgeInsets(), emptyColor: self.theme.pageBackgroundColor)) apply() - - let radialStatusSize: CGFloat = 50.0 - self.statusNode.frame = CGRect(x: floorToScreenPixels((size.width - radialStatusSize) / 2.0), y: floorToScreenPixels((size.height - radialStatusSize) / 2.0), width: radialStatusSize, height: radialStatusSize) } } } diff --git a/TelegramUI/InstantPagePeerReferenceItem.swift b/TelegramUI/InstantPagePeerReferenceItem.swift index f13b92b7ff..1e86077ef8 100644 --- a/TelegramUI/InstantPagePeerReferenceItem.swift +++ b/TelegramUI/InstantPagePeerReferenceItem.swift @@ -32,7 +32,7 @@ final class InstantPagePeerReferenceItem: InstantPageItem { func matchesNode(_ node: InstantPageNode) -> Bool { if let node = node as? InstantPagePeerReferenceNode { - return self.initialPeer.id == node.initialPeer.id && self.safeInset == node.safeInset + return self.initialPeer.id == node.peer?.id && self.safeInset == node.safeInset } else { return false } diff --git a/TelegramUI/InstantPagePeerReferenceNode.swift b/TelegramUI/InstantPagePeerReferenceNode.swift index 45da8f5404..c3c0792e4a 100644 --- a/TelegramUI/InstantPagePeerReferenceNode.swift +++ b/TelegramUI/InstantPagePeerReferenceNode.swift @@ -43,7 +43,6 @@ private enum JoinState: Equatable { final class InstantPagePeerReferenceNode: ASDisplayNode, InstantPageNode { private let account: Account - let initialPeer: Peer let safeInset: CGFloat private let transparent: Bool private let rtl: Bool @@ -58,18 +57,17 @@ final class InstantPagePeerReferenceNode: ASDisplayNode, InstantPageNode { private let activityIndicator: ActivityIndicator private let checkNode: ASImageNode - private var peer: Peer? + var peer: Peer? private var peerDisposable: Disposable? private let joinDisposable = MetaDisposable() - private var joinState: JoinState = .none init(account: Account, strings: PresentationStrings, theme: InstantPageTheme, initialPeer: Peer, safeInset: CGFloat, transparent: Bool, rtl: Bool, openPeer: @escaping (PeerId) -> Void) { self.account = account self.strings = strings self.theme = theme - self.initialPeer = initialPeer + self.peer = initialPeer self.safeInset = safeInset self.transparent = transparent self.rtl = rtl @@ -140,7 +138,7 @@ final class InstantPagePeerReferenceNode: ASDisplayNode, InstantPageNode { self.joinNode.addTarget(self, action: #selector(self.joinPressed), forControlEvents: .touchUpInside) let account = self.account - let signal = actualizedPeer(postbox: account.postbox, network: account.network, peer: self.initialPeer) + let signal = actualizedPeer(postbox: account.postbox, network: account.network, peer: initialPeer) |> mapToSignal({ peer -> Signal in if let peer = peer as? TelegramChannel, let username = peer.username, peer.accessHash == nil { return .single(peer) |> then(resolvePeerByName(account: account, name: username) @@ -160,8 +158,7 @@ final class InstantPagePeerReferenceNode: ASDisplayNode, InstantPageNode { self.peerDisposable = (signal |> deliverOnMainQueue).start(next: { [weak self] peer in if let strongSelf = self { - let textColor = strongSelf.transparent ? UIColor.white : strongSelf.theme.panelPrimaryColor - strongSelf.nameNode.attributedText = NSAttributedString(string: peer.displayTitle, font: Font.medium(17.0), textColor: textColor) + strongSelf.peer = peer if let peer = peer as? TelegramChannel { var joinState = strongSelf.joinState if case .member = peer.participationStatus { @@ -178,6 +175,7 @@ final class InstantPagePeerReferenceNode: ASDisplayNode, InstantPageNode { } strongSelf.updateJoinState(joinState) } + strongSelf.applyThemeAndStrings(themeUpdated: false) strongSelf.setNeedsLayout() } }) @@ -214,6 +212,11 @@ final class InstantPagePeerReferenceNode: ASDisplayNode, InstantPageNode { let secondaryColor = self.transparent ? UIColor.white : self.theme.panelSecondaryColor self.checkNode.image = generateTintedImage(image: UIImage(bundleImageName: "Instant View/PanelCheck"), color: secondaryColor) self.activityIndicator.type = .custom(self.theme.panelAccentColor, 22.0, 2.0, false) + + if !self.transparent { + self.backgroundColor = self.theme.panelBackgroundColor + self.highlightedBackgroundNode.backgroundColor = self.theme.panelHighlightedBackgroundColor + } } self.setNeedsLayout() } @@ -289,13 +292,15 @@ final class InstantPagePeerReferenceNode: ASDisplayNode, InstantPageNode { } @objc func buttonPressed() { - self.openPeer(self.initialPeer.id) + if let peer = self.peer { + self.openPeer(peer.id) + } } @objc func joinPressed() { - if case .notJoined = self.joinState { + if let peer = self.peer, case .notJoined = self.joinState { self.updateJoinState(.inProgress) - self.joinDisposable.set((joinChannel(account: self.account, peerId: self.initialPeer.id) |> deliverOnMainQueue).start(error: { [weak self] _ in + self.joinDisposable.set((joinChannel(account: self.account, peerId: peer.id) |> deliverOnMainQueue).start(error: { [weak self] _ in if let strongSelf = self { if case .inProgress = strongSelf.joinState { strongSelf.updateJoinState(.notJoined) diff --git a/TelegramUI/InstantPageReferenceController.swift b/TelegramUI/InstantPageReferenceController.swift index 7e51126495..010fe0776e 100644 --- a/TelegramUI/InstantPageReferenceController.swift +++ b/TelegramUI/InstantPageReferenceController.swift @@ -13,11 +13,21 @@ final class InstantPageReferenceController: ViewController { private var animatedIn = false private let account: Account + private let theme: InstantPageTheme + private let webPage: TelegramMediaWebpage private let item: InstantPageTextItem + private let openUrl: (InstantPageUrlItem) -> Void + private let openUrlIn: (InstantPageUrlItem) -> Void + private let present: (ViewController, Any?) -> Void - init(account: Account, item: InstantPageTextItem) { + init(account: Account, theme: InstantPageTheme, webPage: TelegramMediaWebpage, item: InstantPageTextItem, openUrl: @escaping (InstantPageUrlItem) -> Void, openUrlIn: @escaping (InstantPageUrlItem) -> Void, present: @escaping (ViewController, Any?) -> Void) { self.account = account + self.theme = theme + self.webPage = webPage self.item = item + self.openUrl = openUrl + self.openUrlIn = openUrlIn + self.present = present super.init(navigationBarPresentationData: nil) @@ -29,7 +39,7 @@ final class InstantPageReferenceController: ViewController { } override public func loadDisplayNode() { - self.displayNode = InstantPageReferenceControllerNode(account: self.account, item: self.item) + self.displayNode = InstantPageReferenceControllerNode(account: self.account, theme: self.theme, webPage: self.webPage, item: self.item, openUrl: self.openUrl, openUrlIn: self.openUrlIn, present: self.present) self.controllerNode.dismiss = { [weak self] in self?.presentingViewController?.dismiss(animated: false, completion: nil) } diff --git a/TelegramUI/InstantPageReferenceControllerNode.swift b/TelegramUI/InstantPageReferenceControllerNode.swift index 67d9e659d5..be662c5530 100644 --- a/TelegramUI/InstantPageReferenceControllerNode.swift +++ b/TelegramUI/InstantPageReferenceControllerNode.swift @@ -2,28 +2,44 @@ import Foundation import Display import AsyncDisplayKit import TelegramCore +import SafariServices class InstantPageReferenceControllerNode: ViewControllerTracingNode, UIScrollViewDelegate { + private let account: Account + private let theme: InstantPageTheme private var presentationData: PresentationData + private let webPage: TelegramMediaWebpage + private let item: InstantPageTextItem - private var containerLayout: (ContainerViewLayout, CGFloat)? - private let dimNode: ASDisplayNode - private let wrappingScrollNode: ASScrollNode private let contentContainerNode: ASDisplayNode private let contentBackgroundNode: ASImageNode - + private var contentNode: InstantPageContentNode? private let titleNode: ASTextNode private let separatorNode: ASDisplayNode - private let closeButton: HighlightableButtonNode + private var linkHighlightingNode: LinkHighlightingNode? + private var textSelectionNode: LinkHighlightingNode? + + private var containerLayout: (ContainerViewLayout, CGFloat)? + + private var openUrl: (InstantPageUrlItem) -> Void + private var openUrlIn: (InstantPageUrlItem) -> Void + private var present: (ViewController, Any?) -> Void var dismiss: (() -> Void)? var close: (() -> Void)? - init(account: Account, item: InstantPageTextItem) { + init(account: Account, theme: InstantPageTheme, webPage: TelegramMediaWebpage, item: InstantPageTextItem, openUrl: @escaping (InstantPageUrlItem) -> Void, openUrlIn: @escaping (InstantPageUrlItem) -> Void, present: @escaping (ViewController, Any?) -> Void) { + self.account = account self.presentationData = account.telegramApplicationContext.currentPresentationData.with { $0 } + self.theme = theme + self.webPage = webPage + self.item = item + self.openUrl = openUrl + self.openUrlIn = openUrlIn + self.present = present self.wrappingScrollNode = ASScrollNode() self.wrappingScrollNode.view.alwaysBounceVertical = true @@ -33,7 +49,7 @@ class InstantPageReferenceControllerNode: ViewControllerTracingNode, UIScrollVie self.dimNode = ASDisplayNode() self.dimNode.backgroundColor = UIColor(white: 0.0, alpha: 0.5) - let roundedBackground = generateStretchableFilledCircleImage(radius: 16.0, color: self.presentationData.theme.actionSheet.opaqueItemBackgroundColor) + let roundedBackground = generateStretchableFilledCircleImage(radius: 16.0, color: self.theme.overlayPanelColor) self.contentContainerNode = ASDisplayNode() self.contentContainerNode.isOpaque = false @@ -45,10 +61,10 @@ class InstantPageReferenceControllerNode: ViewControllerTracingNode, UIScrollVie self.contentBackgroundNode.image = roundedBackground self.titleNode = ASTextNode() - self.titleNode.attributedText = NSAttributedString(string: self.presentationData.strings.ShareMenu_ShareTo, font: Font.medium(20.0), textColor: self.presentationData.theme.actionSheet.primaryTextColor) + self.titleNode.attributedText = NSAttributedString(string: self.presentationData.strings.InstantPage_Reference, font: Font.medium(17.0), textColor: self.theme.panelSecondaryColor) self.separatorNode = ASDisplayNode() - self.separatorNode.backgroundColor = self.presentationData.theme.actionSheet.opaqueItemSeparatorColor + self.separatorNode.backgroundColor = self.theme.controlColor self.closeButton = HighlightableButtonNode() @@ -65,6 +81,9 @@ class InstantPageReferenceControllerNode: ViewControllerTracingNode, UIScrollVie self.wrappingScrollNode.addSubnode(self.contentBackgroundNode) self.wrappingScrollNode.addSubnode(self.contentContainerNode) + + self.contentContainerNode.addSubnode(self.titleNode) + self.contentContainerNode.addSubnode(self.separatorNode) } override func didLoad() { @@ -73,6 +92,21 @@ class InstantPageReferenceControllerNode: ViewControllerTracingNode, UIScrollVie if #available(iOSApplicationExtension 11.0, *) { self.wrappingScrollNode.view.contentInsetAdjustmentBehavior = .never } + + let recognizer = TapLongTapOrDoubleTapGestureRecognizer(target: self, action: #selector(self.tapGesture(_:))) + recognizer.delaysTouchesBegan = false + recognizer.tapActionAtPoint = { [weak self] point in + if let strongSelf = self, let contentNode = strongSelf.contentNode { + return strongSelf.tapActionAtPoint(point.offsetBy(dx: -contentNode.frame.minX, dy: -contentNode.frame.minY)) + } + return .waitForSingleTap + } + recognizer.highlight = { [weak self] point in + if let strongSelf = self, let contentNode = strongSelf.contentNode { + strongSelf.updateTouchesAtPoint(point?.offsetBy(dx: -contentNode.frame.minX, dy: -contentNode.frame.minY)) + } + } + self.contentContainerNode.view.addGestureRecognizer(recognizer) } @objc func closeButtonPressed() { @@ -139,37 +173,47 @@ class InstantPageReferenceControllerNode: ViewControllerTracingNode, UIScrollVie } func containerLayoutUpdated(_ layout: ContainerViewLayout, navigationBarHeight: CGFloat, transition: ContainedViewLayoutTransition) { + self.containerLayout = (layout, navigationBarHeight) + var insets = layout.insets(options: [.statusBar, .input]) let cleanInsets = layout.insets(options: [.statusBar]) insets.top = max(10.0, insets.top) - var bottomInset: CGFloat = 10.0 + cleanInsets.bottom - if insets.bottom > 0 { - bottomInset -= 12.0 + let bottomInset: CGFloat = 10.0 + cleanInsets.bottom + let titleAreaHeight: CGFloat = 54.0 + var contentHeight = titleAreaHeight + bottomInset + + let width = horizontalContainerFillingSizeForLayout(layout: layout, sideInset: layout.safeInsets.left) + + if self.contentNode == nil || self.contentNode?.frame.width != width { + self.contentNode?.removeFromSupernode() + + let sideInset: CGFloat = 16.0 + let (_, items, contentSize) = layoutTextItemWithString(self.item.attributedString, boundingWidth: width - sideInset * 2.0, offset: CGPoint(x: 0.0, y: sideInset)) + let contentNode = InstantPageContentNode(account: self.account, strings: self.presentationData.strings, theme: self.theme, items: items, contentSize: contentSize, inOverlayPanel: true, openMedia: { _ in }, openPeer: { _ in }, openUrl: { _ in }) + transition.updateFrame(node: contentNode, frame: CGRect(origin: CGPoint(x: sideInset, y: titleAreaHeight), size: contentSize)) + self.contentContainerNode.insertSubnode(contentNode, at: 0) + self.contentNode = contentNode + + contentHeight += contentSize.height + sideInset + + contentNode.updateVisibleItems(visibleBounds: contentNode.bounds, animated: false) } - let titleAreaHeight: CGFloat = 54.0 - - let buttonHeight: CGFloat = 57.0 - let sectionSpacing: CGFloat = 8.0 - - let maximumContentHeight = layout.size.height - insets.top - max(bottomInset + buttonHeight, insets.bottom) - sectionSpacing - - let width = horizontalContainerFillingSizeForLayout(layout: layout, sideInset: 10.0 + layout.safeInsets.left) - let sideInset = floor((layout.size.width - width) / 2.0) + let contentContainerFrame = CGRect(origin: CGPoint(x: sideInset, y: layout.size.height - contentHeight), size: CGSize(width: width, height: contentHeight)) + let contentFrame = contentContainerFrame - let contentContainerFrame = CGRect(origin: CGPoint(x: sideInset, y: insets.top), size: CGSize(width: width, height: maximumContentHeight)) - let contentFrame = contentContainerFrame.insetBy(dx: 0.0, dy: 0.0) - - self.containerLayout = (layout, navigationBarHeight) - + var backgroundFrame = CGRect(origin: CGPoint(x: contentFrame.minX, y: contentFrame.minY), size: CGSize(width: contentFrame.size.width, height: contentFrame.size.height + 2000.0)) + if backgroundFrame.minY < contentFrame.minY { + backgroundFrame.origin.y = contentFrame.minY + } + transition.updateFrame(node: self.contentBackgroundNode, frame: backgroundFrame) transition.updateFrame(node: self.wrappingScrollNode, frame: CGRect(origin: CGPoint(), size: layout.size)) - transition.updateFrame(node: self.dimNode, frame: CGRect(origin: CGPoint(), size: layout.size)) let titleSize = self.titleNode.measure(CGSize(width: width, height: titleAreaHeight)) - let titleFrame = CGRect(origin: CGPoint(x: floor((width - titleSize.width) / 2.0), y: 15.0), size: titleSize) + let titleFrame = CGRect(origin: CGPoint(x: 17.0, y: 17.0), size: titleSize) transition.updateFrame(node: self.titleNode, frame: titleFrame) //transition.updateFrame(node: self.closeButtonNode, frame: CGRect(origin: CGPoint(x: sideInset, y: layout.size.height - bottomInset - buttonHeight), size: CGSize(width: width, height: buttonHeight))) @@ -177,4 +221,205 @@ class InstantPageReferenceControllerNode: ViewControllerTracingNode, UIScrollVie transition.updateFrame(node: self.contentContainerNode, frame: contentContainerFrame) transition.updateFrame(node: self.separatorNode, frame: CGRect(origin: CGPoint(x: 0.0, y: titleAreaHeight), size: CGSize(width: contentContainerFrame.size.width, height: UIScreenPixel))) } + + func tapActionAtPoint(_ point: CGPoint) -> TapLongTapOrDoubleTapGestureRecognizerAction { + if let contentNode = self.contentNode { + for item in contentNode.currentLayout.items { + let frame = contentNode.effectiveFrameForItem(item) + if frame.contains(point) { + if item is InstantPagePeerReferenceItem { + return .fail + } else if item is InstantPageAudioItem { + return .fail + } else if item is InstantPageArticleItem { + return .fail + } else if item is InstantPageFeedbackItem { + return .fail + } + if !(item is InstantPageImageItem || item is InstantPagePlayableVideoItem) { + break + } + } + } + } + return .waitForSingleTap + } + + private func updateTouchesAtPoint(_ location: CGPoint?) { + var rects: [CGRect]? + if let contentNode = self.contentNode, let location = location { + for item in contentNode.currentLayout.items { + let itemFrame = contentNode.effectiveFrameForItem(item) + if itemFrame.contains(location) { + var contentOffset = CGPoint() + if let item = item as? InstantPageScrollableItem { + contentOffset = contentNode.scrollableContentOffset(item: item) + } + var itemRects = item.linkSelectionRects(at: location.offsetBy(dx: -itemFrame.minX + contentOffset.x, dy: -itemFrame.minY)) + for i in 0 ..< itemRects.count { + itemRects[i] = itemRects[i].offsetBy(dx: itemFrame.minX - contentOffset.x + contentNode.frame.minX, dy: itemFrame.minY + contentNode.frame.minY).insetBy(dx: -2.0, dy: -2.0) + } + if !itemRects.isEmpty { + rects = itemRects + break + } + } + } + } + + if let rects = rects { + let linkHighlightingNode: LinkHighlightingNode + if let current = self.linkHighlightingNode { + linkHighlightingNode = current + } else { + linkHighlightingNode = LinkHighlightingNode(color: self.theme.linkHighlightColor) + linkHighlightingNode.isUserInteractionEnabled = false + self.linkHighlightingNode = linkHighlightingNode + self.contentContainerNode.addSubnode(linkHighlightingNode) + } + linkHighlightingNode.frame = CGRect(origin: CGPoint(), size: self.contentContainerNode.bounds.size) + linkHighlightingNode.updateRects(rects) + } else if let linkHighlightingNode = self.linkHighlightingNode { + self.linkHighlightingNode = nil + linkHighlightingNode.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.18, removeOnCompletion: false, completion: { [weak linkHighlightingNode] _ in + linkHighlightingNode?.removeFromSupernode() + }) + } + } + + private func textItemAtLocation(_ location: CGPoint) -> (InstantPageTextItem, CGPoint)? { + if let contentNode = self.contentNode { + for item in contentNode.currentLayout.items { + let itemFrame = contentNode.effectiveFrameForItem(item) + if itemFrame.contains(location) { + if let item = item as? InstantPageTextItem, item.selectable { + return (item, CGPoint(x: itemFrame.minX - item.frame.minX + contentNode.frame.minX, y: itemFrame.minY - item.frame.minY + contentNode.frame.minY)) + } else if let item = item as? InstantPageScrollableItem { + let contentOffset = contentNode.scrollableContentOffset(item: item) + if let (textItem, parentOffset) = item.textItemAtLocation(location.offsetBy(dx: -itemFrame.minX + contentOffset.x, dy: -itemFrame.minY)) { + return (textItem, itemFrame.origin.offsetBy(dx: parentOffset.x - contentOffset.x + contentNode.frame.minX, dy: parentOffset.y + contentNode.frame.minY)) + } + } + } + } + } + return nil + } + + private func urlForTapLocation(_ location: CGPoint) -> InstantPageUrlItem? { + if let contentNode = self.contentNode, let (item, parentOffset) = self.textItemAtLocation(location) { + return item.urlAttribute(at: location.offsetBy(dx: -item.frame.minX - parentOffset.x + contentNode.frame.minX, dy: -item.frame.minY - parentOffset.y + contentNode.frame.minY)) + } + return nil + } + + @objc private func tapGesture(_ recognizer: TapLongTapOrDoubleTapGestureRecognizer) { + guard let contentNode = self.contentNode else { + return + } + switch recognizer.state { + case .ended: + if let (gesture, location) = recognizer.lastRecognizedGestureAndLocation { + let location = location.offsetBy(dx: -contentNode.frame.minX, dy: -contentNode.frame.minY) + switch gesture { + case .tap: + if let url = self.urlForTapLocation(location) { + self.close?() + self.openUrl(url) + } + case .longTap: + if let url = self.urlForTapLocation(location) { + let canOpenIn = availableOpenInOptions(applicationContext: self.account.telegramApplicationContext, item: .url(url: url.url)).count > 1 + let openText = canOpenIn ? self.presentationData.strings.Conversation_FileOpenIn : self.presentationData.strings.Conversation_LinkDialogOpen + let actionSheet = ActionSheetController(instantPageTheme: self.theme) + actionSheet.setItemGroups([ActionSheetItemGroup(items: [ + ActionSheetTextItem(title: url.url), + ActionSheetButtonItem(title: openText, color: .accent, action: { [weak self, weak actionSheet] in + actionSheet?.dismissAnimated() + if let strongSelf = self { + strongSelf.close?() + if canOpenIn { + strongSelf.openUrlIn(url) + } else { + strongSelf.openUrl(url) + } + } + }), + ActionSheetButtonItem(title: self.presentationData.strings.ShareMenu_CopyShareLink, color: .accent, action: { [weak actionSheet] in + actionSheet?.dismissAnimated() + UIPasteboard.general.string = url.url + }), + ActionSheetButtonItem(title: self.presentationData.strings.Conversation_AddToReadingList, color: .accent, action: { [weak actionSheet] in + actionSheet?.dismissAnimated() + if let link = URL(string: url.url) { + let _ = try? SSReadingList.default()?.addItem(with: link, title: nil, previewText: nil) + } + }) + ]), ActionSheetItemGroup(items: [ + ActionSheetButtonItem(title: self.presentationData.strings.Common_Cancel, color: .accent, action: { [weak actionSheet] in + actionSheet?.dismissAnimated() + }) + ])]) + self.present(actionSheet, nil) + } else if let (item, parentOffset) = self.textItemAtLocation(location) { + let textFrame = item.frame + var itemRects = item.lineRects() + for i in 0 ..< itemRects.count { + itemRects[i] = itemRects[i].offsetBy(dx: parentOffset.x + textFrame.minX, dy: parentOffset.y + textFrame.minY).insetBy(dx: -2.0, dy: -2.0) + } + self.updateTextSelectionRects(itemRects, text: item.plainText()) + } + default: + break + } + } + default: + break + } + } + + private func updateTextSelectionRects(_ rects: [CGRect], text: String?) { + if let text = text, !rects.isEmpty { + let textSelectionNode: LinkHighlightingNode + if let current = self.textSelectionNode { + textSelectionNode = current + } else { + textSelectionNode = LinkHighlightingNode(color: UIColor.lightGray.withAlphaComponent(0.4)) + textSelectionNode.isUserInteractionEnabled = false + self.textSelectionNode = textSelectionNode + self.contentContainerNode.addSubnode(textSelectionNode) + } + textSelectionNode.frame = CGRect(origin: CGPoint(), size: self.contentContainerNode.bounds.size) + textSelectionNode.updateRects(rects) + + var coveringRect = rects[0] + for i in 1 ..< rects.count { + coveringRect = coveringRect.union(rects[i]) + } + + let controller = ContextMenuController(actions: [ContextMenuAction(content: .text(self.presentationData.strings.Conversation_ContextMenuCopy), action: { + UIPasteboard.general.string = text + }), ContextMenuAction(content: .text(self.presentationData.strings.Conversation_ContextMenuShare), action: { [weak self] in + if let strongSelf = self, case let .Loaded(content) = strongSelf.webPage.content { + strongSelf.present(ShareController(account: strongSelf.account, subject: .quote(text: text, url: content.url)), nil) + } + })]) + controller.dismissed = { [weak self] in + self?.updateTextSelectionRects([], text: nil) + } + self.present(controller, ContextMenuControllerPresentationArguments(sourceNodeAndRect: { [weak self] in + if let strongSelf = self { + return (strongSelf.contentContainerNode, coveringRect.insetBy(dx: -3.0, dy: -3.0), strongSelf, strongSelf.bounds) + } else { + return nil + } + })) + textSelectionNode.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.18) + } else if let textSelectionNode = self.textSelectionNode { + self.textSelectionNode = nil + textSelectionNode.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.18, removeOnCompletion: false, completion: { [weak textSelectionNode] _ in + textSelectionNode?.removeFromSupernode() + }) + } + } } diff --git a/TelegramUI/InstantPageStoredState.swift b/TelegramUI/InstantPageStoredState.swift new file mode 100644 index 0000000000..ab02c180eb --- /dev/null +++ b/TelegramUI/InstantPageStoredState.swift @@ -0,0 +1,75 @@ +import Foundation +import SwiftSignalKit +import Postbox +import TelegramCore + +final class InstantPageStoredDetailsState: PostboxCoding { + let index: Int32 + let expanded: Bool + let details: [InstantPageStoredDetailsState] + + init(index: Int32, expanded: Bool, details: [InstantPageStoredDetailsState]) { + self.index = index + self.expanded = expanded + self.details = details + } + + init(decoder: PostboxDecoder) { + self.index = decoder.decodeInt32ForKey("index", orElse: 0) + self.expanded = decoder.decodeBoolForKey("expanded", orElse: false) + self.details = decoder.decodeObjectArrayForKey("details") + } + + func encode(_ encoder: PostboxEncoder) { + encoder.encodeInt32(self.index, forKey: "index") + encoder.encodeBool(self.expanded, forKey: "expanded") + encoder.encodeObjectArray(self.details, forKey: "details") + } +} + +final class InstantPageStoredState: PostboxCoding { + let contentOffset: Double + let details: [InstantPageStoredDetailsState] + + init(contentOffset: Double, details: [InstantPageStoredDetailsState]) { + self.contentOffset = contentOffset + self.details = details + } + + init(decoder: PostboxDecoder) { + self.contentOffset = decoder.decodeDoubleForKey("offset", orElse: 0.0) + self.details = decoder.decodeObjectArrayForKey("details") + } + + func encode(_ encoder: PostboxEncoder) { + encoder.encodeDouble(self.contentOffset, forKey: "offset") + encoder.encodeObjectArray(self.details, forKey: "details") + } +} + +func instantPageStoredState(postbox: Postbox, webPage: TelegramMediaWebpage) -> Signal { + return postbox.transaction { transaction -> InstantPageStoredState? in + let key = ValueBoxKey(length: 8) + key.setInt64(0, value: webPage.webpageId.id) + if let entry = transaction.retrieveItemCacheEntry(id: ItemCacheEntryId(collectionId: ApplicationSpecificItemCacheCollectionId.instantPageStoredState, key: key)) as? InstantPageStoredState { + return entry + } else { + return nil + } + } +} + +private let collectionSpec = ItemCacheCollectionSpec(lowWaterItemCount: 100, highWaterItemCount: 200) + +func updateInstantPageStoredStateInteractively(postbox: Postbox, webPage: TelegramMediaWebpage, state: InstantPageStoredState?) -> Signal { + return postbox.transaction { transaction -> Void in + let key = ValueBoxKey(length: 8) + key.setInt64(0, value: webPage.webpageId.id) + let id = ItemCacheEntryId(collectionId: ApplicationSpecificItemCacheCollectionId.instantPageStoredState, key: key) + if let state = state { + transaction.putItemCacheEntry(id: id, entry: state, collectionSpec: collectionSpec) + } else { + transaction.removeItemCacheEntry(id: id) + } + } +} diff --git a/TelegramUI/InstantPageTextItem.swift b/TelegramUI/InstantPageTextItem.swift index e4553bba44..737962510a 100644 --- a/TelegramUI/InstantPageTextItem.swift +++ b/TelegramUI/InstantPageTextItem.swift @@ -711,13 +711,13 @@ func layoutTextItemWithString(_ string: NSAttributedString, boundingWidth: CGFlo } var height: CGFloat = 0.0 - if !lines.isEmpty && !(string.length == 1 && hasAnchors) { + if !lines.isEmpty && !(string.string == "\u{200b}" && hasAnchors) { height = lines.last!.frame.maxY + extraDescent } var textWidth = boundingWidth var requiresScroll = false - if maxLineWidth > boundingWidth + 10.0 { + if !imageItems.isEmpty && maxLineWidth > boundingWidth + 10.0 { textWidth = maxLineWidth requiresScroll = true } diff --git a/TelegramUI/InstantPageTheme.swift b/TelegramUI/InstantPageTheme.swift index 943d7886c7..26d615b29d 100644 --- a/TelegramUI/InstantPageTheme.swift +++ b/TelegramUI/InstantPageTheme.swift @@ -1,5 +1,6 @@ import Foundation import Postbox +import Display enum InstantPageFontStyle { case sans @@ -80,6 +81,7 @@ struct InstantPageTextCategories { } final class InstantPageTheme { + let type: InstantPageThemeType let pageBackgroundColor: UIColor let textCategories: InstantPageTextCategories @@ -100,12 +102,14 @@ final class InstantPageTheme { let tableBorderColor: UIColor let tableHeaderColor: UIColor - let controlColor: UIColor let imageTintColor: UIColor? - init(pageBackgroundColor: UIColor, textCategories: InstantPageTextCategories, serif: Bool, codeBlockBackgroundColor: UIColor, linkColor: UIColor, textHighlightColor: UIColor, linkHighlightColor: UIColor, markerColor: UIColor, panelBackgroundColor: UIColor, panelHighlightedBackgroundColor: UIColor, panelPrimaryColor: UIColor, panelSecondaryColor: UIColor, panelAccentColor: UIColor, tableBorderColor: UIColor, tableHeaderColor: UIColor, controlColor: UIColor, imageTintColor: UIColor?) { + let overlayPanelColor: UIColor + + init(type: InstantPageThemeType, pageBackgroundColor: UIColor, textCategories: InstantPageTextCategories, serif: Bool, codeBlockBackgroundColor: UIColor, linkColor: UIColor, textHighlightColor: UIColor, linkHighlightColor: UIColor, markerColor: UIColor, panelBackgroundColor: UIColor, panelHighlightedBackgroundColor: UIColor, panelPrimaryColor: UIColor, panelSecondaryColor: UIColor, panelAccentColor: UIColor, tableBorderColor: UIColor, tableHeaderColor: UIColor, controlColor: UIColor, imageTintColor: UIColor?, overlayPanelColor: UIColor) { + self.type = type self.pageBackgroundColor = pageBackgroundColor self.textCategories = textCategories self.serif = serif @@ -123,14 +127,16 @@ final class InstantPageTheme { self.tableHeaderColor = tableHeaderColor self.controlColor = controlColor self.imageTintColor = imageTintColor + self.overlayPanelColor = overlayPanelColor } func withUpdatedFontStyles(sizeMultiplier: CGFloat, forceSerif: Bool) -> InstantPageTheme { - return InstantPageTheme(pageBackgroundColor: pageBackgroundColor, textCategories: self.textCategories.withUpdatedFontStyles(sizeMultiplier: sizeMultiplier, forceSerif: forceSerif), serif: forceSerif, codeBlockBackgroundColor: codeBlockBackgroundColor, linkColor: linkColor, textHighlightColor: textHighlightColor, linkHighlightColor: linkHighlightColor, markerColor: markerColor, panelBackgroundColor: panelBackgroundColor, panelHighlightedBackgroundColor: panelHighlightedBackgroundColor, panelPrimaryColor: panelPrimaryColor, panelSecondaryColor: panelSecondaryColor, panelAccentColor: panelAccentColor, tableBorderColor: tableBorderColor, tableHeaderColor: tableHeaderColor, controlColor: controlColor, imageTintColor: imageTintColor) + return InstantPageTheme(type: type, pageBackgroundColor: pageBackgroundColor, textCategories: self.textCategories.withUpdatedFontStyles(sizeMultiplier: sizeMultiplier, forceSerif: forceSerif), serif: forceSerif, codeBlockBackgroundColor: codeBlockBackgroundColor, linkColor: linkColor, textHighlightColor: textHighlightColor, linkHighlightColor: linkHighlightColor, markerColor: markerColor, panelBackgroundColor: panelBackgroundColor, panelHighlightedBackgroundColor: panelHighlightedBackgroundColor, panelPrimaryColor: panelPrimaryColor, panelSecondaryColor: panelSecondaryColor, panelAccentColor: panelAccentColor, tableBorderColor: tableBorderColor, tableHeaderColor: tableHeaderColor, controlColor: controlColor, imageTintColor: imageTintColor, overlayPanelColor: overlayPanelColor) } } private let lightTheme = InstantPageTheme( + type: .light, pageBackgroundColor: .white, textCategories: InstantPageTextCategories( kicker: InstantPageTextAttributes(font: InstantPageFont(style: .sans, size: 15.0, lineSpacingFactor: 0.685), color: .black), @@ -156,10 +162,12 @@ private let lightTheme = InstantPageTheme( tableBorderColor: UIColor(rgb: 0xe2e2e2), tableHeaderColor: UIColor(rgb: 0xf4f4f4), controlColor: UIColor(rgb: 0xc7c7cd), - imageTintColor: nil + imageTintColor: nil, + overlayPanelColor: .white ) private let sepiaTheme = InstantPageTheme( + type: .sepia, pageBackgroundColor: UIColor(rgb: 0xf8f1e2), textCategories: InstantPageTextCategories( kicker: InstantPageTextAttributes(font: InstantPageFont(style: .sans, size: 15.0, lineSpacingFactor: 0.685), color: UIColor(rgb: 0x4f321d)), @@ -185,10 +193,12 @@ private let sepiaTheme = InstantPageTheme( tableBorderColor: UIColor(rgb: 0xddd1b8), tableHeaderColor: UIColor(rgb: 0xf0e7d4), controlColor: UIColor(rgb: 0xddd1b8), - imageTintColor: nil + imageTintColor: nil, + overlayPanelColor: UIColor(rgb: 0xf8f1e2) ) private let grayTheme = InstantPageTheme( + type: .gray, pageBackgroundColor: UIColor(rgb: 0x5a5a5c), textCategories: InstantPageTextCategories( kicker: InstantPageTextAttributes(font: InstantPageFont(style: .sans, size: 15.0, lineSpacingFactor: 0.685), color: UIColor(rgb: 0xcecece)), @@ -214,10 +224,12 @@ private let grayTheme = InstantPageTheme( tableBorderColor: UIColor(rgb: 0x484848), tableHeaderColor: UIColor(rgb: 0x555556), controlColor: UIColor(rgb: 0x484848), - imageTintColor: UIColor(rgb: 0xcecece) + imageTintColor: UIColor(rgb: 0xcecece), + overlayPanelColor: UIColor(rgb: 0x5a5a5c) ) private let darkTheme = InstantPageTheme( + type: .dark, pageBackgroundColor: UIColor(rgb: 0x000000), textCategories: InstantPageTextCategories( kicker: InstantPageTextAttributes(font: InstantPageFont(style: .sans, size: 15.0, lineSpacingFactor: 0.685), color: UIColor(rgb: 0xb0b0b0)), @@ -243,7 +255,8 @@ private let darkTheme = InstantPageTheme( tableBorderColor: UIColor(rgb: 0x303030), tableHeaderColor: UIColor(rgb: 0x131313), controlColor: UIColor(rgb: 0x303030), - imageTintColor: UIColor(rgb: 0xb0b0b0) + imageTintColor: UIColor(rgb: 0xb0b0b0), + overlayPanelColor: UIColor(rgb: 0x232323) ) private func fontSizeMultiplierForVariant(_ variant: InstantPagePresentationFontSize) -> CGFloat { @@ -307,3 +320,15 @@ func instantPageThemeForType(_ type: InstantPageThemeType, settings: InstantPage return darkTheme.withUpdatedFontStyles(sizeMultiplier: fontSizeMultiplierForVariant(settings.fontSize), forceSerif: settings.forceSerif) } } + +extension ActionSheetControllerTheme { + convenience init(instantPageTheme: InstantPageTheme) { + self.init(dimColor: UIColor(white: 0.0, alpha: 0.4), backgroundType: instantPageTheme.type != .dark ? .light : .dark, itemBackgroundColor: instantPageTheme.overlayPanelColor, itemHighlightedBackgroundColor: instantPageTheme.panelHighlightedBackgroundColor, standardActionTextColor: instantPageTheme.panelAccentColor, destructiveActionTextColor: instantPageTheme.panelAccentColor, disabledActionTextColor: instantPageTheme.panelAccentColor, primaryTextColor: instantPageTheme.textCategories.paragraph.color, secondaryTextColor: instantPageTheme.textCategories.caption.color, controlAccentColor: instantPageTheme.panelAccentColor) + } +} + +extension ActionSheetController { + convenience init(instantPageTheme: InstantPageTheme) { + self.init(theme: ActionSheetControllerTheme(instantPageTheme: instantPageTheme)) + } +} diff --git a/TelegramUI/ItemCacheKeys.swift b/TelegramUI/ItemCacheKeys.swift new file mode 100644 index 0000000000..ac266efee6 --- /dev/null +++ b/TelegramUI/ItemCacheKeys.swift @@ -0,0 +1,11 @@ +import Foundation +import TelegramCore +import Postbox + +private enum ApplicationSpecificItemCacheCollectionIdValues: Int8 { + case instantPageStoredState = 0 +} + +public struct ApplicationSpecificItemCacheCollectionId { + public static let instantPageStoredState = applicationSpecificItemCacheCollectionId(ApplicationSpecificItemCacheCollectionIdValues.instantPageStoredState.rawValue) +} diff --git a/TelegramUI/NavigateToChatController.swift b/TelegramUI/NavigateToChatController.swift index 64b120b68e..c322f812ca 100644 --- a/TelegramUI/NavigateToChatController.swift +++ b/TelegramUI/NavigateToChatController.swift @@ -9,21 +9,22 @@ public enum NavigateToChatKeepStack { case never } -public func navigateToChatController(navigationController: NavigationController, chatController: ChatController? = nil, account: Account, chatLocation: ChatLocation, messageId: MessageId? = nil, botStart: ChatControllerInitialBotStart? = nil, keepStack: NavigateToChatKeepStack = .default, purposefulAction: (() -> Void)? = nil, animated: Bool = true, completion: @escaping () -> Void = {}) { +public func navigateToChatController(navigationController: NavigationController, chatController: ChatController? = nil, account: Account, chatLocation: ChatLocation, messageId: MessageId? = nil, botStart: ChatControllerInitialBotStart? = nil, keepStack: NavigateToChatKeepStack = .default, purposefulAction: (() -> Void)? = nil, scrollToEndIfExists: Bool = false, animated: Bool = true, completion: @escaping () -> Void = {}) { var found = false var isFirst = true for controller in navigationController.viewControllers.reversed() { if let controller = controller as? ChatController, controller.chatLocation == chatLocation { if let messageId = messageId { - controller.purposefulAction = purposefulAction controller.navigateToMessage(messageLocation: .id(messageId), animated: isFirst, completion: { [weak navigationController, weak controller] in if let navigationController = navigationController, let controller = controller { let _ = navigationController.popToViewController(controller, animated: animated) } }) - } else { - let _ = navigationController.popToViewController(controller, animated: animated) + } else if scrollToEndIfExists && isFirst { + controller.scrollToEndOfHistory() } + controller.purposefulAction = purposefulAction + let _ = navigationController.popToViewController(controller, animated: animated) completion() found = true break diff --git a/TelegramUI/Notices.swift b/TelegramUI/Notices.swift index e366f90b30..2144a6a934 100644 --- a/TelegramUI/Notices.swift +++ b/TelegramUI/Notices.swift @@ -75,6 +75,33 @@ final class ApplicationSpecificCounterNotice: NoticeEntry { } } +final class ApplicationSpecificTimestampNotice: NoticeEntry { + let value: Int32 + + init(value: Int32) { + self.value = value + } + + init(decoder: PostboxDecoder) { + self.value = decoder.decodeInt32ForKey("v", orElse: 0) + } + + func encode(_ encoder: PostboxEncoder) { + encoder.encodeInt32(self.value, forKey: "v") + } + + func isEqual(to: NoticeEntry) -> Bool { + if let to = to as? ApplicationSpecificTimestampNotice { + if self.value != to.value { + return false + } + return true + } else { + return false + } + } +} + private func noticeNamespace(namespace: Int32) -> ValueBoxKey { let key = ValueBoxKey(length: 4) key.setInt32(0, value: namespace) @@ -106,6 +133,7 @@ private enum ApplicationSpecificGlobalNotice: Int32 { private struct ApplicationSpecificNoticeKeys { private static let botPaymentLiabilityNamespace: Int32 = 1 private static let globalNamespace: Int32 = 2 + private static let permissionsNamespace: Int32 = 3 static func botPaymentLiabilityNotice(peerId: PeerId) -> NoticeEntryKey { return NoticeEntryKey(namespace: noticeNamespace(namespace: botPaymentLiabilityNamespace), key: noticeKey(peerId: peerId, key: 0)) diff --git a/TelegramUI/NotificationsAndSounds.swift b/TelegramUI/NotificationsAndSounds.swift index 33dd9cdb6e..e409539faf 100644 --- a/TelegramUI/NotificationsAndSounds.swift +++ b/TelegramUI/NotificationsAndSounds.swift @@ -572,16 +572,16 @@ private func filteredGlobalSound(_ sound: PeerMessageSound) -> PeerMessageSound private func notificationsAndSoundsEntries(authorizationStatus: AccessType, globalSettings: GlobalNotificationSettingsSet, inAppSettings: InAppNotificationSettings, exceptions: (users: NotificationExceptionMode, groups: NotificationExceptionMode, channels: NotificationExceptionMode), presentationData: PresentationData) -> [NotificationsAndSoundsEntry] { var entries: [NotificationsAndSoundsEntry] = [] - switch authorizationStatus { - case .denied: - entries.append(.permissionInfo(presentationData.theme, presentationData.strings)) - entries.append(.permissionEnable(presentationData.theme, "Turn ON in Settings")) - case .notDetermined: - entries.append(.permissionInfo(presentationData.theme, presentationData.strings)) - entries.append(.permissionEnable(presentationData.theme, "Turn Notifications ON")) - default: - break - } +// switch authorizationStatus { +// case .denied: +// entries.append(.permissionInfo(presentationData.theme, presentationData.strings)) +// entries.append(.permissionEnable(presentationData.theme, "Turn ON in Settings")) +// case .notDetermined: +// entries.append(.permissionInfo(presentationData.theme, presentationData.strings)) +// entries.append(.permissionEnable(presentationData.theme, "Turn Notifications ON")) +// default: +// break +// } entries.append(.messageHeader(presentationData.theme, presentationData.strings.Notifications_MessageNotifications)) entries.append(.messageAlerts(presentationData.theme, presentationData.strings.Notifications_MessageNotificationsAlert, globalSettings.privateChats.enabled)) diff --git a/TelegramUI/PeerReportController.swift b/TelegramUI/PeerReportController.swift index d0fb8a9b90..6a6eb7d352 100644 --- a/TelegramUI/PeerReportController.swift +++ b/TelegramUI/PeerReportController.swift @@ -45,7 +45,6 @@ func peerReportOptionsController(account: Account, subject: PeerReportSubject, p title = presentationData.strings.ReportPeer_ReasonOther } items.append(ActionSheetButtonItem(title: title, action: { [weak controller] in - //account.reportPeer#ae189d5f peer:InputPeer reason:ReportReason = Bool; var reportReason: ReportReason? switch option { case .spam: @@ -54,8 +53,8 @@ func peerReportOptionsController(account: Account, subject: PeerReportSubject, p reportReason = .violence case .pornoghraphy: reportReason = .porno - case .copyright: - reportReason = .copyright + case .copyright: + reportReason = .copyright case .other: break } diff --git a/TelegramUI/PermissionContentNode.swift b/TelegramUI/PermissionContentNode.swift new file mode 100644 index 0000000000..2d559047e3 --- /dev/null +++ b/TelegramUI/PermissionContentNode.swift @@ -0,0 +1,96 @@ +import Foundation +import Display +import AsyncDisplayKit + +final class PermissionContentNode: ASDisplayNode { + private let iconNode: ASImageNode + private let titleNode: ImmediateTextNode + private let textNode: ImmediateTextNode + private let actionButton: SolidRoundedButtonNode + private let privacyPolicyButton: HighlightableButtonNode + + var kind: PermissionStateKind + private var title: String + + var buttonAction: (() -> Void)? + var openPrivacyPolicy: (() -> Void)? + + init(theme: PresentationTheme, strings: PresentationStrings, kind: PermissionStateKind, icon: UIImage?, title: String, text: String, buttonTitle: String, buttonAction: @escaping () -> Void, openPrivacyPolicy: (() -> Void)?) { + self.kind = kind + + self.buttonAction = buttonAction + self.openPrivacyPolicy = openPrivacyPolicy + + self.title = title + + self.iconNode = ASImageNode() + self.iconNode.isLayerBacked = true + self.iconNode.displayWithoutProcessing = true + self.iconNode.displaysAsynchronously = false + + self.titleNode = ImmediateTextNode() + self.titleNode.maximumNumberOfLines = 0 + self.titleNode.textAlignment = .center + self.titleNode.isUserInteractionEnabled = false + self.titleNode.displaysAsynchronously = false + + self.textNode = ImmediateTextNode() + self.textNode.textAlignment = .center + self.textNode.maximumNumberOfLines = 0 + self.textNode.displaysAsynchronously = false + + self.actionButton = SolidRoundedButtonNode(theme: theme, height: 48.0, cornerRadius: 9.0) + + self.privacyPolicyButton = HighlightableButtonNode() + self.privacyPolicyButton.setTitle(strings.Permissions_PrivacyPolicy, with: Font.regular(16.0), with: theme.list.itemAccentColor, for: .normal) + + super.init() + + self.iconNode.image = icon + self.title = title + + let body = MarkdownAttributeSet(font: Font.regular(16.0), textColor: theme.list.itemPrimaryTextColor) + let link = MarkdownAttributeSet(font: Font.regular(16.0), textColor: theme.list.itemAccentColor, additionalAttributes: [TelegramTextAttributes.URL: ""]) + self.textNode.attributedText = parseMarkdownIntoAttributedString(text.replacingOccurrences(of: "]", with: "]()"), attributes: MarkdownAttributes(body: body, bold: body, link: link, linkAttribute: { _ in nil }), textAlignment: .center) + + self.actionButton.title = buttonTitle + self.privacyPolicyButton.isHidden = openPrivacyPolicy != nil + + self.addSubnode(self.iconNode) + self.addSubnode(self.titleNode) + self.addSubnode(self.textNode) + self.addSubnode(self.actionButton) + self.addSubnode(self.privacyPolicyButton) + + self.actionButton.pressed = { [weak self] in + self?.buttonAction?() + } + + self.privacyPolicyButton.addTarget(self, action: #selector(self.privacyPolicyPressed), forControlEvents: .touchUpInside) + } + + @objc func privacyPolicyPressed() { + self.openPrivacyPolicy?() + } + + func updateLayout(size: CGSize, insets: UIEdgeInsets, transition: ContainedViewLayoutTransition) { + let sidePadding: CGFloat = 20.0 + //let sideButtonInset: CGFloat = 16.0 + let titleSize = self.titleNode.updateLayout(CGSize(width: size.width - sidePadding * 2.0, height: .greatestFiniteMagnitude)) + let textSize = self.textNode.updateLayout(CGSize(width: size.width - sidePadding * 2.0, height: .greatestFiniteMagnitude)) + let buttonHeight = self.actionButton.updateLayout(width: size.width, transition: transition) + + let titleSubtitleSpacing: CGFloat = 12.0 + + let textHeight = titleSize.height + titleSubtitleSpacing + textSize.height + + + let minContentHeight = textHeight + let contentHeight = min(215.0, max(size.height - insets.top - insets.bottom - 40.0, minContentHeight)) + let contentOrigin = insets.top + floor((size.height - insets.top - insets.bottom - contentHeight) / 2.0) + let titleFrame = CGRect(origin: CGPoint(x: floor((size.width - titleSize.width) / 2.0), y: contentOrigin), size: titleSize) + transition.updateFrame(node: self.titleNode, frame: titleFrame) + transition.updateFrame(node: self.textNode, frame: CGRect(origin: CGPoint(x: floor((size.width - textSize.width) / 2.0), y: titleFrame.maxY + titleSubtitleSpacing), size: textSize)) + transition.updateFrame(node: self.actionButton, frame: CGRect(x: 0.0, y: 0.0, width: size.width, height: buttonHeight)) + } +} diff --git a/TelegramUI/PermissionController.swift b/TelegramUI/PermissionController.swift index b97bca6e94..36b977f0c3 100644 --- a/TelegramUI/PermissionController.swift +++ b/TelegramUI/PermissionController.swift @@ -5,46 +5,89 @@ import SwiftSignalKit import TelegramCore final class PermissionController : ViewController { + private let account: Account + private var controllerNode: PermissionControllerNode { return self.displayNode as! PermissionControllerNode } - private let account: Account - private let strings: PresentationStrings - private let theme: AuthorizationTheme + private var _ready = Promise() + override public var ready: Promise { + return self._ready + } - private var animatedIn = false + private var didPlayPresentationAnimation = false - private var allow: (() -> Void)? + private var presentationData: PresentationData + private var presentationDataDisposable: Disposable? init(account: Account) { self.account = account - self.strings = account.telegramApplicationContext.currentPresentationData.with { $0 }.strings - self.theme = defaultLightAuthorizationTheme + self.presentationData = account.telegramApplicationContext.currentPresentationData.with { $0 } - super.init(navigationBarPresentationData: nil) + super.init(navigationBarPresentationData: NavigationBarPresentationData(theme: NavigationBarTheme(buttonColor: self.presentationData.theme.rootController.navigationBar.accentTextColor, disabledButtonColor: self.presentationData.theme.rootController.navigationBar.disabledButtonColor, primaryTextColor: self.presentationData.theme.rootController.navigationBar.primaryTextColor, backgroundColor: .clear, separatorColor: .clear, badgeBackgroundColor: .clear, badgeStrokeColor: .clear, badgeTextColor: .clear), strings: NavigationBarStrings(presentationStrings: self.presentationData.strings))) self.supportedOrientations = ViewControllerSupportedOrientations(regularSize: .all, compactSize: .portrait) - self.statusBar.statusBarStyle = self.theme.statusBarStyle + self.statusBar.statusBarStyle = self.presentationData.theme.rootController.statusBar.style.style + + self.presentationDataDisposable = (account.telegramApplicationContext.presentationData + |> deliverOnMainQueue).start(next: { [weak self] presentationData in + if let strongSelf = self { + let previousTheme = strongSelf.presentationData.theme + let previousStrings = strongSelf.presentationData.strings + + strongSelf.presentationData = presentationData + + if previousTheme !== presentationData.theme || previousStrings !== presentationData.strings { + strongSelf.updateThemeAndStrings() + } + } + }) } required init(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") } + deinit { + self.presentationDataDisposable?.dispose() + } + + override func viewDidAppear(_ animated: Bool) { + super.viewDidAppear(animated) + + if let presentationArguments = self.presentationArguments as? ViewControllerPresentationArguments, !self.didPlayPresentationAnimation { + self.didPlayPresentationAnimation = true + if case .modalSheet = presentationArguments.presentationAnimation { + self.controllerNode.animateIn() + } + } + } + + override func dismiss(completion: (() -> Void)? = nil) { + self.controllerNode.animateOut(completion: { [weak self] in + self?.presentingViewController?.dismiss(animated: false, completion: nil) + completion?() + }) + self.view.endEditing(true) + } + + private func updateThemeAndStrings() { + self.statusBar.statusBarStyle = self.presentationData.theme.rootController.statusBar.style.style + self.navigationBar?.updatePresentationData(NavigationBarPresentationData(presentationData: self.presentationData)) + self.title = self.presentationData.strings.Settings_AppLanguage + self.navigationItem.backBarButtonItem = UIBarButtonItem(title: nil, style: .plain, target: nil, action: nil) + self.navigationItem.rightBarButtonItem = UIBarButtonItem(title: self.presentationData.strings.Permissions_Skip, style: .plain, target: self, action: #selector(PermissionController.nextPressed)) + self.controllerNode.updatePresentationData(self.presentationData) + } + override func loadDisplayNode() { - self.displayNode = PermissionControllerNode(theme: self.theme, strings: self.strings) + self.displayNode = PermissionControllerNode(account: self.account) self.displayNodeDidLoad() - self.controllerNode.dismiss = { [weak self] in - self?.presentingViewController?.dismiss(animated: false, completion: nil) - } self.controllerNode.allow = { [weak self] in - self?.allow?() - } - self.controllerNode.next = { [weak self] in - self?.dismiss(completion: nil) + //self?.allow?() } self.controllerNode.openPrivacyPolicy = { [weak self] in if let strongSelf = self { @@ -53,27 +96,13 @@ final class PermissionController : ViewController { } } - override public func viewDidAppear(_ animated: Bool) { - super.viewDidAppear(animated) - - if !self.animatedIn { - self.animatedIn = true - self.controllerNode.animateIn() - } - } - - override func dismiss(completion: (() -> Void)?) { - self.controllerNode.animateOut(completion: completion) - } - - func updateData(subject: DeviceAccessSubject, currentStatus: AccessType, allow: @escaping () -> Void) { - self.allow = allow - self.controllerNode.updateData(subject: .notifications, currentStatus: currentStatus) - } - override func containerLayoutUpdated(_ layout: ContainerViewLayout, transition: ContainedViewLayoutTransition) { super.containerLayoutUpdated(layout, transition: transition) self.controllerNode.containerLayoutUpdated(layout, navigationBarHeight: self.navigationHeight, transition: transition) } + + @objc private func nextPressed() { + //self.controllerNode.activateNextAction() + } } diff --git a/TelegramUI/PermissionControllerNode.swift b/TelegramUI/PermissionControllerNode.swift index 98e6ad3e0e..30828fc64a 100644 --- a/TelegramUI/PermissionControllerNode.swift +++ b/TelegramUI/PermissionControllerNode.swift @@ -4,58 +4,88 @@ import AsyncDisplayKit import SwiftSignalKit import TelegramCore -final class PermissionControllerNode: ASDisplayNode { - private let theme: AuthorizationTheme - private let strings: PresentationStrings +enum PermissionStateKind: Int32 { + case contacts + case notifications + case siri + case cellularData +} + +private enum PermissionRequestStatus { + case requestable + case denied +} + +private enum PermissionNotificationsRequestStatus { + case requestable + case denied + case unreachable +} + +private enum PermissionState: Equatable { + case contacts(status: PermissionRequestStatus) + case notifications(status: PermissionNotificationsRequestStatus) + case siri(status: PermissionRequestStatus) + case cellularData - private let iconNode: ASImageNode - private let titleNode: ImmediateTextNode - private let textNode: ImmediateTextNode - private let buttonNode: SolidRoundedButtonNode - private let privacyPolicyNode: HighlightableButtonNode - private let nextNode: HighlightableButtonNode - - private var layoutArguments: (ContainerViewLayout, CGFloat)? - - private var title: String? - - var allow: (() -> Void)? - var next: (() -> Void)? { - didSet { - self.nextNode.isHidden = self.next == nil + var kind: PermissionStateKind { + switch self { + case .contacts: + return .contacts + case .notifications: + return .notifications + case .siri: + return .siri + case .cellularData: + return .cellularData } } +} + +private struct PermissionControllerDataState: Equatable { + var state: PermissionState? +} + +private struct PermissionControllerLayoutState: Equatable { + let layout: ContainerViewLayout + let navigationHeight: CGFloat +} + +private struct PermissionControllerInnerState: Equatable { + var layout: PermissionControllerLayoutState? + var data: PermissionControllerDataState +} + +private struct PermissionControllerState: Equatable { + var layout: PermissionControllerLayoutState + var data: PermissionControllerDataState +} + +extension PermissionControllerState { + init?(_ state: PermissionControllerInnerState) { + guard let layout = state.layout else { + return nil + } + self.init(layout: layout, data: state.data) + } +} + +final class PermissionControllerNode: ASDisplayNode { + private let account: Account + private var presentationData: PresentationData + + private var innerState: PermissionControllerInnerState + + private var contentNode: PermissionContentNode? + + var allow: (() -> Void)? var openPrivacyPolicy: (() -> Void)? var dismiss: (() -> Void)? - init(theme: AuthorizationTheme, strings: PresentationStrings) { - self.theme = theme - self.strings = strings - - self.iconNode = ASImageNode() - self.iconNode.isLayerBacked = true - self.iconNode.displayWithoutProcessing = true - self.iconNode.displaysAsynchronously = false - - self.titleNode = ImmediateTextNode() - self.titleNode.maximumNumberOfLines = 0 - self.titleNode.textAlignment = .center - self.titleNode.isUserInteractionEnabled = false - self.titleNode.displaysAsynchronously = false - - self.textNode = ImmediateTextNode() - self.textNode.textAlignment = .center - self.textNode.maximumNumberOfLines = 0 - self.textNode.displaysAsynchronously = false - - self.buttonNode = SolidRoundedButtonNode(theme: self.theme, height: 48.0, cornerRadius: 9.0) - - self.privacyPolicyNode = HighlightableButtonNode() - self.privacyPolicyNode.setTitle("Privacy Policy", with: Font.regular(16.0), with: self.theme.accentColor, for: .normal) - - self.nextNode = HighlightableButtonNode() - self.nextNode.setTitle("Skip", with: Font.regular(17.0), with: self.theme.accentColor, for: .normal) - self.nextNode.isHidden = true + init(account: Account) { + self.account = account + self.presentationData = account.telegramApplicationContext.currentPresentationData.with { $0 } + self.innerState = PermissionControllerInnerState(layout: nil, data: PermissionControllerDataState(state: nil)) super.init() @@ -63,119 +93,124 @@ final class PermissionControllerNode: ASDisplayNode { return UITracingLayerView() }) - self.backgroundColor = self.theme.backgroundColor - - self.addSubnode(self.iconNode) - self.addSubnode(self.titleNode) - self.addSubnode(self.textNode) - self.addSubnode(self.buttonNode) - self.addSubnode(self.privacyPolicyNode) - self.addSubnode(self.nextNode) - - self.buttonNode.pressed = { [weak self] in - self?.allow?() - self?.dismiss?() - } - - self.privacyPolicyNode.addTarget(self, action: #selector(self.privacyPolicyPressed), forControlEvents: .touchUpInside) - self.nextNode.addTarget(self, action: #selector(self.nextPressed), forControlEvents: .touchUpInside) + self.applyPresentationData() } - func updateData(subject: DeviceAccessSubject, currentStatus: AccessType) { - var icon: UIImage? - var title = "" - var text = "" - var buttonTitle = "" - var hasPrivacyPolicy = false + func updatePresentationData(_ presentationData: PresentationData) { + self.presentationData = presentationData - switch subject { - case .contacts: - icon = UIImage(bundleImageName: "Settings/Permissions/Contacts") - title = "Sync Your Contacts" - text = "See who's on Telegram and switch seamlessly, without having to \"add\" to add your friends." - if currentStatus == .denied { - buttonTitle = "Allow in Settings" - } else { - buttonTitle = "Allow Access" - } - hasPrivacyPolicy = true - case .notifications: - icon = UIImage(bundleImageName: "Settings/Permissions/Notifications") - title = "Turn ON Notifications" - text = "Don't miss important messages from your friends and coworkers." - if currentStatus == .denied || currentStatus == .restricted { - buttonTitle = "Turn ON in Settings" - } else { - buttonTitle = "Turn Notifications ON" - } - case .cellularData: - icon = UIImage(bundleImageName: "Settings/Permissions/CellularData") - title = "Turn ON Mobile Data" - text = "Don't worry, Telegram keeps network usage to a minimum. You can further control this in Settings > Data and Storage." - buttonTitle = "Turn ON in Settings" - case .siri: - title = "Turn ON Siri" - text = "Use Siri to send messages and make calls." - if currentStatus == .denied { - buttonTitle = "Turn ON in Settings" - } else { - buttonTitle = "Turn Siri ON" - } - default: - break + self.applyPresentationData() + } + + private func applyPresentationData() { + self.backgroundColor = self.presentationData.theme.list.plainBackgroundColor } + + func animateIn(completion: (() -> Void)? = nil) { + self.layer.animatePosition(from: CGPoint(x: self.layer.position.x, y: self.layer.position.y + self.layer.bounds.size.height), to: self.layer.position, duration: 0.5, timingFunction: kCAMediaTimingFunctionSpring) + } + + func animateOut(completion: (() -> Void)? = nil) { + self.layer.animatePosition(from: self.layer.position, to: CGPoint(x: self.layer.position.x, y: self.layer.position.y + self.layer.bounds.size.height), duration: 0.2, timingFunction: kCAMediaTimingFunctionEaseInEaseOut, removeOnCompletion: false, completion: { _ in + completion?() + }) + } + + private func updateState(_ f: (PermissionControllerInnerState) -> PermissionControllerInnerState, transition: ContainedViewLayoutTransition) { + let updatedState = f(self.innerState) + if updatedState != self.innerState { + self.innerState = updatedState + if let state = PermissionControllerState(updatedState) { + self.transition(state: state, transition: transition) + } } + } + + private func transition(state: PermissionControllerState, transition: ContainedViewLayoutTransition) { + let insets = state.layout.layout.insets(options: [.statusBar]) + let contentFrame = CGRect(origin: CGPoint(x: 0.0, y: 0.0), size: CGSize(width: state.layout.layout.size.width, height: state.layout.layout.size.height)) - self.iconNode.image = icon - self.title = title - - let body = MarkdownAttributeSet(font: Font.regular(16.0), textColor: self.theme.primaryColor) - let link = MarkdownAttributeSet(font: Font.regular(16.0), textColor: self.theme.accentColor, additionalAttributes: [TelegramTextAttributes.URL: ""]) - self.textNode.attributedText = parseMarkdownIntoAttributedString(text.replacingOccurrences(of: "]", with: "]()"), attributes: MarkdownAttributes(body: body, bold: body, link: link, linkAttribute: { _ in nil }), textAlignment: .center) - - self.buttonNode.title = buttonTitle - - self.privacyPolicyNode.isHidden = !hasPrivacyPolicy - - if let (layout, navigationHeight) = self.layoutArguments { - self.containerLayoutUpdated(layout, navigationBarHeight: navigationHeight, transition: .immediate) + if state.data.state?.kind != self.contentNode?.kind { + if let dataState = state.data.state { + let icon: UIImage? + let title: String + let text: String + let buttonTitle: String + let hasPrivacyPolicy: Bool + + switch dataState { + case let .contacts(status): + icon = UIImage(bundleImageName: "Settings/Permissions/Contacts") + title = self.presentationData.strings.Permissions_ContactsTitle + text = self.presentationData.strings.Permissions_ContactsText + if status == .denied { + buttonTitle = self.presentationData.strings.Permissions_ContactsAllowInSettings + } else { + buttonTitle = self.presentationData.strings.Permissions_ContactsAllow + } + hasPrivacyPolicy = true + case let .notifications(status): + icon = UIImage(bundleImageName: "Settings/Permissions/Notifications") + title = self.presentationData.strings.Permissions_NotificationsTitle + text = self.presentationData.strings.Permissions_NotificationsText + if status == .denied { + buttonTitle = self.presentationData.strings.Permissions_NotificationsAllowInSettings + } else { + buttonTitle = self.presentationData.strings.Permissions_NotificationsAllow + } + hasPrivacyPolicy = false + case let .siri(status): + icon = UIImage(bundleImageName: "Settings/Permissions/CellularData") + title = self.presentationData.strings.Permissions_SiriTitle + text = self.presentationData.strings.Permissions_SiriText + if status == .denied { + buttonTitle = self.presentationData.strings.Permissions_SiriAllowInSettings + } else { + buttonTitle = self.presentationData.strings.Permissions_SiriAllow + } + hasPrivacyPolicy = false + case .cellularData: + icon = UIImage(bundleImageName: "Settings/Permissions/CellularData") + title = self.presentationData.strings.Permissions_CellularDataTitle + text = self.presentationData.strings.Permissions_CellularDataText + buttonTitle = self.presentationData.strings.Permissions_CellularDataAllowInSettings + hasPrivacyPolicy = false + } + + let contentNode = PermissionContentNode(theme: self.presentationData.theme, strings: self.presentationData.strings, kind: dataState.kind, icon: icon, title: title, text: text, buttonTitle: buttonTitle, buttonAction: {}, openPrivacyPolicy: hasPrivacyPolicy ? self.openPrivacyPolicy : nil) + self.insertSubnode(contentNode, at: 0) + contentNode.updateLayout(size: contentFrame.size, insets: insets, transition: .immediate) + contentNode.frame = contentFrame + if let currentContentNode = self.contentNode { + transition.updatePosition(node: currentContentNode, position: CGPoint(x: -contentFrame.size.width / 2.0, y: contentFrame.midY), completion: { [weak currentContentNode] _ in + currentContentNode?.removeFromSupernode() + }) + transition.animateHorizontalOffsetAdditive(node: contentNode, offset: -contentFrame.width) + } else if transition.isAnimated { + contentNode.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.3) + } + self.contentNode = contentNode + } else if let currentContentNode = self.contentNode { + transition.updateAlpha(node: currentContentNode, alpha: 0.0, completion: { [weak currentContentNode] _ in + currentContentNode?.removeFromSupernode() + }) + self.contentNode = nil + } + } else if let contentNode = self.contentNode { + transition.updateFrame(node: contentNode, frame: contentFrame) + contentNode.updateLayout(size: contentFrame.size, insets: insets, transition: transition) } } func containerLayoutUpdated(_ layout: ContainerViewLayout, navigationBarHeight: CGFloat, transition: ContainedViewLayoutTransition) { - self.layoutArguments = (layout, navigationBarHeight) + self.updateState({ state in + var state = state + state.layout = PermissionControllerLayoutState(layout: layout, navigationHeight: navigationBarHeight) + return state + }, transition: transition) + } + + func activateNextAction() { - let insets = layout.insets(options: [.statusBar]) - let fontSize: CGFloat - let sideInset: CGFloat - if layout.size.width > 330.0 { - fontSize = 22.0 - sideInset = 38.0 - } else { - fontSize = 18.0 - sideInset = 20.0 - } - - let nextSize = self.nextNode.measure(layout.size) - transition.updateFrame(node: self.nextNode, frame: CGRect(x: layout.size.width - insets.right - nextSize.width - 16.0, y: insets.top + 10.0, width: nextSize.width, height: nextSize.height)) - - self.titleNode.attributedText = NSAttributedString(string: self.title ?? "", font: Font.semibold(fontSize), textColor: self.theme.primaryColor) - - let titleSize = self.titleNode.updateLayout(CGSize(width: layout.size.width - sideInset * 2.0, height: CGFloat.greatestFiniteMagnitude)) - let textSize = self.textNode.updateLayout(CGSize(width: layout.size.width - sideInset * 2.0, height: CGFloat.greatestFiniteMagnitude)) - let buttonHeight = self.buttonNode.updateLayout(width: layout.size.width, transition: transition) - - var items: [AuthorizationLayoutItem] = [] - if let icon = self.iconNode.image { - items.append(AuthorizationLayoutItem(node: self.iconNode, size: icon.size, spacingBefore: AuthorizationLayoutItemSpacing(weight: 122.0, maxValue: 122.0), spacingAfter: AuthorizationLayoutItemSpacing(weight: 15.0, maxValue: 15.0))) - } - items.append(AuthorizationLayoutItem(node: self.titleNode, size: titleSize, spacingBefore: AuthorizationLayoutItemSpacing(weight: 18.0, maxValue: 18.0), spacingAfter: AuthorizationLayoutItemSpacing(weight: 0.0, maxValue: 0.0))) - items.append(AuthorizationLayoutItem(node: self.textNode, size: textSize, spacingBefore: AuthorizationLayoutItemSpacing(weight: 5.0, maxValue: 5.0), spacingAfter: AuthorizationLayoutItemSpacing(weight: 35.0, maxValue: 35.0))) - items.append(AuthorizationLayoutItem(node: self.buttonNode, size: CGSize(width: layout.size.width, height: buttonHeight), spacingBefore: AuthorizationLayoutItemSpacing(weight: 35.0, maxValue: 35.0), spacingAfter: AuthorizationLayoutItemSpacing(weight: 50.0, maxValue: 50.0))) - - let _ = layoutAuthorizationItems(bounds: CGRect(origin: CGPoint(x: 0.0, y: insets.top), size: CGSize(width: layout.size.width, height: layout.size.height - insets.top - insets.bottom - 20.0)), items: items, transition: transition, failIfDoesNotFit: false) - - let privacyPolicySize = self.privacyPolicyNode.measure(layout.size) - transition.updateFrame(node: self.privacyPolicyNode, frame: CGRect(x: (layout.size.width - privacyPolicySize.width) / 2.0, y: self.buttonNode.frame.maxY + (layout.size.height - self.buttonNode.frame.maxY - insets.bottom - privacyPolicySize.height) / 2.0, width: privacyPolicySize.width, height: privacyPolicySize.height)) } @objc func allowPressed() { @@ -185,21 +220,4 @@ final class PermissionControllerNode: ASDisplayNode { @objc func privacyPolicyPressed() { self.openPrivacyPolicy?() } - - @objc func nextPressed() { - self.next?() - } - - func animateIn(completion: (() -> Void)? = nil) { - self.layer.animatePosition(from: CGPoint(x: self.layer.position.x, y: self.layer.position.y + self.layer.bounds.size.height), to: self.layer.position, duration: 0.5, timingFunction: kCAMediaTimingFunctionSpring) - } - - func animateOut(completion: (() -> Void)? = nil) { - self.layer.animatePosition(from: self.layer.position, to: CGPoint(x: self.layer.position.x, y: self.layer.position.y + self.layer.bounds.size.height), duration: 0.2, timingFunction: kCAMediaTimingFunctionEaseInEaseOut, removeOnCompletion: false, completion: { [weak self] _ in - if let strongSelf = self { - strongSelf.dismiss?() - } - completion?() - }) - } } diff --git a/TelegramUI/PresentationResourceKey.swift b/TelegramUI/PresentationResourceKey.swift index 60b51a2fbb..679d3798bc 100644 --- a/TelegramUI/PresentationResourceKey.swift +++ b/TelegramUI/PresentationResourceKey.swift @@ -90,14 +90,9 @@ enum PresentationResourceKey: Int32 { case chatBubbleMediaOverlayControlSecret - case chatLoadingIndicatorBackgroundImage - case chatServiceBubbleFillImage - case chatBubbleSecretMediaIcon case chatBubbleSecretMediaCompactIcon - case chatFreeformContentAdditionalInfoBackgroundImage - case chatInstantVideoWithWallpaperBackgroundImage case chatInstantVideoWithoutWallpaperBackgroundImage @@ -126,7 +121,6 @@ enum PresentationResourceKey: Int32 { case chatInfoItemBackgroundImageWithWallpaper case chatInfoItemBackgroundImageWithoutWallpaper - case chatEmptyItemBackgroundImage case chatEmptyItemIconImage case chatInputPanelCloseIconImage diff --git a/TelegramUI/PresentationResourcesChat.swift b/TelegramUI/PresentationResourcesChat.swift index 105ba040e4..659e30bc31 100644 --- a/TelegramUI/PresentationResourcesChat.swift +++ b/TelegramUI/PresentationResourcesChat.swift @@ -65,8 +65,9 @@ struct PresentationResourcesChat { }) } - static func principalGraphics(_ theme: PresentationTheme, wallpaper: Bool) -> PrincipalThemeEssentialGraphics { - let key: PresentationResourceKey = !wallpaper ? PresentationResourceKey.chatPrincipalThemeEssentialGraphicsWithoutWallpaper : PresentationResourceKey.chatPrincipalThemeEssentialGraphicsWithWallpaper + static func principalGraphics(_ theme: PresentationTheme, wallpaper: TelegramWallpaper) -> PrincipalThemeEssentialGraphics { + let hasWallpaper = !wallpaper.isEmpty && !wallpaper.isBuiltin + let key: PresentationResourceKey = !hasWallpaper ? PresentationResourceKey.chatPrincipalThemeEssentialGraphicsWithoutWallpaper : PresentationResourceKey.chatPrincipalThemeEssentialGraphicsWithWallpaper return theme.object(key.rawValue, { theme in return PrincipalThemeEssentialGraphics(theme.chat, wallpaper: wallpaper) }) as! PrincipalThemeEssentialGraphics @@ -86,7 +87,7 @@ struct PresentationResourcesChat { static func chatServiceVerticalLineImage(_ theme: PresentationTheme) -> UIImage? { return theme.image(PresentationResourceKey.chatServiceVerticalLineImage.rawValue, { theme in - return generateLineImage(color: theme.chat.serviceMessage.serviceMessagePrimaryTextColor) + return generateLineImage(color: theme.chat.serviceMessage.components.withDefaultWallpaper.primaryText) }) } @@ -168,16 +169,6 @@ struct PresentationResourcesChat { }) } - static func chatServiceBubbleFillImage(_ theme: PresentationTheme) -> UIImage? { - return theme.image(PresentationResourceKey.chatServiceBubbleFillImage.rawValue, { theme in - return generateImage(CGSize(width: 20.0, height: 20.0), contextGenerator: { size, context -> Void in - context.clear(CGRect(origin: CGPoint(), size: size)) - context.setFillColor(theme.chat.serviceMessage.serviceMessageFillColor.cgColor) - context.fillEllipse(in: CGRect(origin: CGPoint(), size: size)) - })?.stretchableImage(withLeftCapWidth: 8, topCapHeight: 8) - }) - } - static func chatBubbleSecretMediaIcon(_ theme: PresentationTheme) -> UIImage? { return theme.image(PresentationResourceKey.chatBubbleSecretMediaIcon.rawValue, { theme in generateTintedImage(image: UIImage(bundleImageName: "Chat/Message/SecretMediaIcon"), color: theme.chat.bubble.mediaOverlayControlForegroundColor) @@ -198,12 +189,6 @@ struct PresentationResourcesChat { }) } - static func chatFreeformContentAdditionalInfoBackgroundImage(_ theme: PresentationTheme) -> UIImage? { - return theme.image(PresentationResourceKey.chatFreeformContentAdditionalInfoBackgroundImage.rawValue, { theme in - return generateStretchableFilledCircleImage(radius: 4.0, color: theme.chat.serviceMessage.serviceMessageFillColor) - }) - } - static func chatInstantVideoBackgroundImage(_ theme: PresentationTheme, wallpaper: Bool) -> UIImage? { let key: PresentationResourceKey = !wallpaper ? PresentationResourceKey.chatInstantVideoWithoutWallpaperBackgroundImage : PresentationResourceKey.chatInstantVideoWithWallpaperBackgroundImage return theme.image(key.rawValue, { theme in @@ -286,15 +271,9 @@ struct PresentationResourcesChat { }) } - static func chatEmptyItemBackgroundImage(_ theme: PresentationTheme) -> UIImage? { - return theme.image(PresentationResourceKey.chatEmptyItemBackgroundImage.rawValue, { theme in - return generateStretchableFilledCircleImage(radius: 14.0, color: theme.chat.serviceMessage.serviceMessageFillColor) - }) - } - static func chatEmptyItemIconImage(_ theme: PresentationTheme) -> UIImage? { return theme.image(PresentationResourceKey.chatEmptyItemIconImage.rawValue, { theme in - return generateTintedImage(image: UIImage(bundleImageName: "Chat/Empty Chat/Chat"), color: theme.chat.serviceMessage.serviceMessagePrimaryTextColor) + return generateTintedImage(image: UIImage(bundleImageName: "Chat/Empty Chat/Chat"), color: theme.chat.serviceMessage.components.withDefaultWallpaper.primaryText) }) } @@ -900,12 +879,6 @@ struct PresentationResourcesChat { }) } - static func chatLoadingIndicatorBackgroundImage(_ theme: PresentationTheme) -> UIImage? { - return theme.image(PresentationResourceKey.chatLoadingIndicatorBackgroundImage.rawValue, { theme in - return generateStretchableFilledCircleImage(diameter: 30.0, color: theme.chat.serviceMessage.serviceMessageFillColor) - }) - } - static func chatBubbleReplyThumbnailPlayImage(_ theme: PresentationTheme) -> UIImage? { return theme.image(PresentationResourceKey.chatBubbleReplyThumbnailPlayImage.rawValue, { theme in return generateImage(CGSize(width: 16.0, height: 16.0), rotatedContext: { size, context in @@ -1002,8 +975,8 @@ struct PresentationResourcesChat { context.translateBy(x: 0.0, y: 1.0) - context.setFillColor(theme.chat.serviceMessage.serviceMessagePrimaryTextColor.cgColor) - context.setStrokeColor(theme.chat.serviceMessage.serviceMessagePrimaryTextColor.cgColor) + context.setFillColor(theme.chat.serviceMessage.components.withDefaultWallpaper.primaryText.cgColor) + context.setStrokeColor(theme.chat.serviceMessage.components.withDefaultWallpaper.primaryText.cgColor) context.setLineWidth(1.32) let _ = try? drawSvgPath(context, path: "M4.5,0.600000024 C5.88071187,0.600000024 7,1.88484952 7,3.46979169 L7,7.39687502 C7,8.9818172 5.88071187,10.2666667 4.5,10.2666667 C3.11928813,10.2666667 2,8.9818172 2,7.39687502 L2,3.46979169 C2,1.88484952 3.11928813,0.600000024 4.5,0.600000024 S ") diff --git a/TelegramUI/PresentationStrings.swift b/TelegramUI/PresentationStrings.swift index 1d41271f2f..e2e9d835a5 100644 --- a/TelegramUI/PresentationStrings.swift +++ b/TelegramUI/PresentationStrings.swift @@ -308,2956 +308,2976 @@ public final class PresentationStrings { public var Passport_Identity_Selfie: String { return self._s[107]! } public var Passport_Identity_GenderMale: String { return self._s[108]! } public var Paint_Delete: String { return self._s[109]! } - public var Passport_Identity_AddDriversLicense: String { return self._s[110]! } - public var Passport_Language_ne: String { return self._s[111]! } - public var Channel_MessagePhotoUpdated: String { return self._s[112]! } - public var Passport_Address_OneOfTypePassportRegistration: String { return self._s[113]! } - public var Cache_Help: String { return self._s[114]! } - public var SocksProxySetup_ProxyStatusConnected: String { return self._s[116]! } + public var Group_Username_RevokeExistingUsernamesInfo: String { return self._s[110]! } + public var Passport_Identity_AddDriversLicense: String { return self._s[111]! } + public var Passport_Language_ne: String { return self._s[112]! } + public var Channel_MessagePhotoUpdated: String { return self._s[113]! } + public var Passport_Address_OneOfTypePassportRegistration: String { return self._s[114]! } + public var Cache_Help: String { return self._s[115]! } + public var SocksProxySetup_ProxyStatusConnected: String { return self._s[117]! } public func Login_EmailPhoneBody(_ _0: String, _ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[117]!, self._r[117]!, [_0, _1, _2]) + return formatWithArgumentRanges(self._s[118]!, self._r[118]!, [_0, _1, _2]) } - public var Checkout_ShippingAddress: String { return self._s[119]! } - public var Channel_BanList_RestrictedTitle: String { return self._s[120]! } - public var Checkout_TotalAmount: String { return self._s[121]! } - public var Appearance_TextSize: String { return self._s[122]! } - public var Passport_Address_TypeResidentialAddress: String { return self._s[123]! } - public var Notification_Exceptions_AlwaysOff: String { return self._s[124]! } - public var Conversation_MessageEditedLabel: String { return self._s[125]! } - public var SharedMedia_EmptyLinksText: String { return self._s[126]! } + public var Checkout_ShippingAddress: String { return self._s[120]! } + public var Channel_BanList_RestrictedTitle: String { return self._s[121]! } + public var Checkout_TotalAmount: String { return self._s[122]! } + public var Appearance_TextSize: String { return self._s[123]! } + public var Passport_Address_TypeResidentialAddress: String { return self._s[124]! } + public var Notification_Exceptions_AlwaysOff: String { return self._s[125]! } + public var Conversation_MessageEditedLabel: String { return self._s[126]! } + public var SharedMedia_EmptyLinksText: String { return self._s[127]! } public func Conversation_RestrictedTextTimed(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[127]!, self._r[127]!, [_0]) + return formatWithArgumentRanges(self._s[128]!, self._r[128]!, [_0]) } - public var Passport_Address_AddResidentialAddress: String { return self._s[128]! } - public var Calls_NoCallsPlaceholder: String { return self._s[129]! } - public var Passport_Address_AddPassportRegistration: String { return self._s[130]! } - public var Conversation_PinMessageAlert_OnlyPin: String { return self._s[131]! } - public var PasscodeSettings_UnlockWithFaceId: String { return self._s[132]! } - public var ContactInfo_Title: String { return self._s[133]! } - public var ReportPeer_ReasonOther_Send: String { return self._s[135]! } - public var Notifications_Badge: String { return self._s[137]! } - public var Conversation_InstantPagePreview: String { return self._s[138]! } - public var PasscodeSettings_SimplePasscodeHelp: String { return self._s[139]! } + public var Passport_Address_AddResidentialAddress: String { return self._s[129]! } + public var Calls_NoCallsPlaceholder: String { return self._s[130]! } + public var Passport_Address_AddPassportRegistration: String { return self._s[131]! } + public var Conversation_PinMessageAlert_OnlyPin: String { return self._s[132]! } + public var PasscodeSettings_UnlockWithFaceId: String { return self._s[133]! } + public var ContactInfo_Title: String { return self._s[134]! } + public var ReportPeer_ReasonOther_Send: String { return self._s[136]! } + public var Notifications_Badge: String { return self._s[138]! } + public var Conversation_InstantPagePreview: String { return self._s[139]! } + public var PasscodeSettings_SimplePasscodeHelp: String { return self._s[140]! } public func Time_PreciseDate_m9(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[140]!, self._r[140]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[141]!, self._r[141]!, [_1, _2, _3]) } - public var GroupInfo_Title: String { return self._s[142]! } - public var State_Updating: String { return self._s[144]! } - public var PrivacyPolicy_AgeVerificationAgree: String { return self._s[145]! } - public var Map_GetDirections: String { return self._s[146]! } + public var GroupInfo_Title: String { return self._s[143]! } + public var State_Updating: String { return self._s[145]! } + public var PrivacyPolicy_AgeVerificationAgree: String { return self._s[146]! } + public var Map_GetDirections: String { return self._s[147]! } public func TwoStepAuth_PendingEmailHelp(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[147]!, self._r[147]!, [_0]) + return formatWithArgumentRanges(self._s[148]!, self._r[148]!, [_0]) } - public var UserInfo_PhoneCall: String { return self._s[149]! } - public var Passport_Language_bn: String { return self._s[151]! } - public var MusicPlayer_VoiceNote: String { return self._s[152]! } - public var Paint_Duplicate: String { return self._s[153]! } - public var Channel_Username_InvalidTaken: String { return self._s[154]! } - public var Conversation_ClearGroupHistory: String { return self._s[155]! } - public var Passport_Address_OneOfTypeRentalAgreement: String { return self._s[156]! } - public var Stickers_GroupStickersHelp: String { return self._s[159]! } - public var SecretChat_Title: String { return self._s[160]! } - public var Group_UpgradeConfirmation: String { return self._s[161]! } - public var Checkout_LiabilityAlertTitle: String { return self._s[162]! } - public var GroupInfo_GroupNamePlaceholder: String { return self._s[164]! } + public var UserInfo_PhoneCall: String { return self._s[150]! } + public var Passport_Language_bn: String { return self._s[152]! } + public var MusicPlayer_VoiceNote: String { return self._s[153]! } + public var Paint_Duplicate: String { return self._s[154]! } + public var Channel_Username_InvalidTaken: String { return self._s[155]! } + public var Conversation_ClearGroupHistory: String { return self._s[156]! } + public var Passport_Address_OneOfTypeRentalAgreement: String { return self._s[157]! } + public var Stickers_GroupStickersHelp: String { return self._s[160]! } + public var SecretChat_Title: String { return self._s[161]! } + public var Group_UpgradeConfirmation: String { return self._s[162]! } + public var Checkout_LiabilityAlertTitle: String { return self._s[163]! } + public var GroupInfo_GroupNamePlaceholder: String { return self._s[165]! } public func Time_PreciseDate_m11(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[166]!, self._r[166]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[167]!, self._r[167]!, [_1, _2, _3]) } - public var Passport_DeletePersonalDetailsConfirmation: String { return self._s[167]! } + public var Passport_DeletePersonalDetailsConfirmation: String { return self._s[168]! } public func UserInfo_NotificationsDefaultSound(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[168]!, self._r[168]!, [_0]) + return formatWithArgumentRanges(self._s[169]!, self._r[169]!, [_0]) } - public var Passport_Email_Help: String { return self._s[169]! } + public var Passport_Email_Help: String { return self._s[170]! } public func MESSAGE_GEOLIVE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[171]!, self._r[171]!, [_1]) + return formatWithArgumentRanges(self._s[172]!, self._r[172]!, [_1]) } public func Notification_JoinedGroupByLink(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[172]!, self._r[172]!, [_0]) + return formatWithArgumentRanges(self._s[173]!, self._r[173]!, [_0]) } - public var LoginPassword_Title: String { return self._s[173]! } - public var Login_HaveNotReceivedCodeInternal: String { return self._s[174]! } - public var PasscodeSettings_SimplePasscode: String { return self._s[176]! } - public var NewContact_Title: String { return self._s[177]! } - public var Username_CheckingUsername: String { return self._s[178]! } - public var Login_ResetAccountProtected_TimerTitle: String { return self._s[179]! } - public var Checkout_Email: String { return self._s[180]! } - public var CheckoutInfo_SaveInfo: String { return self._s[181]! } - public var UserInfo_InviteBotToGroup: String { return self._s[182]! } + public var LoginPassword_Title: String { return self._s[174]! } + public var Login_HaveNotReceivedCodeInternal: String { return self._s[175]! } + public var PasscodeSettings_SimplePasscode: String { return self._s[177]! } + public var NewContact_Title: String { return self._s[178]! } + public var Username_CheckingUsername: String { return self._s[179]! } + public var Login_ResetAccountProtected_TimerTitle: String { return self._s[180]! } + public var Checkout_Email: String { return self._s[181]! } + public var CheckoutInfo_SaveInfo: String { return self._s[182]! } + public var UserInfo_InviteBotToGroup: String { return self._s[183]! } public func ChangePhoneNumberCode_CallTimer(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[183]!, self._r[183]!, [_0]) + return formatWithArgumentRanges(self._s[184]!, self._r[184]!, [_0]) } - public var TwoStepAuth_SetupPasswordEnterPasswordNew: String { return self._s[184]! } - public var Weekday_Wednesday: String { return self._s[185]! } + public var TwoStepAuth_SetupPasswordEnterPasswordNew: String { return self._s[185]! } + public var Weekday_Wednesday: String { return self._s[186]! } public func Channel_AdminLog_MessageToggleSignaturesOff(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[186]!, self._r[186]!, [_0]) + return formatWithArgumentRanges(self._s[187]!, self._r[187]!, [_0]) } - public var Month_ShortDecember: String { return self._s[187]! } - public var Channel_SignMessages: String { return self._s[188]! } - public var Appearance_Title: String { return self._s[189]! } - public var ReportPeer_ReasonCopyright: String { return self._s[190]! } - public var Conversation_Moderate_Delete: String { return self._s[191]! } - public var Conversation_CloudStorage_ChatStatus: String { return self._s[192]! } - public var Login_InfoTitle: String { return self._s[194]! } - public var Privacy_GroupsAndChannels_NeverAllow_Placeholder: String { return self._s[195]! } - public var Message_Video: String { return self._s[196]! } - public var Notification_ChannelInviterSelf: String { return self._s[197]! } - public var Channel_AdminLog_BanEmbedLinks: String { return self._s[198]! } - public var Conversation_SecretLinkPreviewAlert: String { return self._s[199]! } + public var Month_ShortDecember: String { return self._s[188]! } + public var Channel_SignMessages: String { return self._s[189]! } + public var Appearance_Title: String { return self._s[190]! } + public var ReportPeer_ReasonCopyright: String { return self._s[191]! } + public var Conversation_Moderate_Delete: String { return self._s[192]! } + public var Conversation_CloudStorage_ChatStatus: String { return self._s[193]! } + public var Login_InfoTitle: String { return self._s[195]! } + public var Privacy_GroupsAndChannels_NeverAllow_Placeholder: String { return self._s[196]! } + public var Message_Video: String { return self._s[197]! } + public var Notification_ChannelInviterSelf: String { return self._s[198]! } + public var Channel_AdminLog_BanEmbedLinks: String { return self._s[199]! } + public var Conversation_SecretLinkPreviewAlert: String { return self._s[200]! } public func CHANNEL_MESSAGE_GEOLIVE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[201]!, self._r[201]!, [_1]) + return formatWithArgumentRanges(self._s[202]!, self._r[202]!, [_1]) } - public var Cache_Videos: String { return self._s[202]! } - public var Call_ReportSkip: String { return self._s[203]! } - public var NetworkUsageSettings_MediaImageDataSection: String { return self._s[204]! } - public var Group_Setup_HistoryTitle: String { return self._s[205]! } - public var TwoStepAuth_GenericHelp: String { return self._s[206]! } + public var Cache_Videos: String { return self._s[203]! } + public var Call_ReportSkip: String { return self._s[204]! } + public var NetworkUsageSettings_MediaImageDataSection: String { return self._s[205]! } + public var Group_Setup_HistoryTitle: String { return self._s[206]! } + public var TwoStepAuth_GenericHelp: String { return self._s[207]! } public func DialogList_SingleRecordingAudioSuffix(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[207]!, self._r[207]!, [_0]) + return formatWithArgumentRanges(self._s[208]!, self._r[208]!, [_0]) } - public var Privacy_TopPeersDelete: String { return self._s[208]! } - public var Checkout_NewCard_CardholderNameTitle: String { return self._s[210]! } - public var Settings_FAQ_Button: String { return self._s[211]! } + public var Privacy_TopPeersDelete: String { return self._s[209]! } + public var Checkout_NewCard_CardholderNameTitle: String { return self._s[211]! } + public var Settings_FAQ_Button: String { return self._s[212]! } public func GroupInfo_AddParticipantConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[212]!, self._r[212]!, [_0]) + return formatWithArgumentRanges(self._s[213]!, self._r[213]!, [_0]) } public func Notification_PinnedLiveLocationMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[215]!, self._r[215]!, [_0]) + return formatWithArgumentRanges(self._s[216]!, self._r[216]!, [_0]) } - public var AccessDenied_PhotosRestricted: String { return self._s[216]! } - public var Map_Locating: String { return self._s[217]! } - public var AutoDownloadSettings_Unlimited: String { return self._s[218]! } - public var Passport_Language_km: String { return self._s[219]! } - public var MediaPicker_LivePhotoDescription: String { return self._s[220]! } - public var Passport_DiscardMessageDescription: String { return self._s[221]! } - public var SocksProxySetup_Title: String { return self._s[224]! } - public var SharedMedia_EmptyMusicText: String { return self._s[225]! } - public var Cache_ByPeerHeader: String { return self._s[227]! } - public var Bot_GroupStatusReadsHistory: String { return self._s[228]! } - public var TwoStepAuth_ResetAccountConfirmation: String { return self._s[229]! } - public var CallSettings_Always: String { return self._s[230]! } - public var Message_ImageExpired: String { return self._s[231]! } - public var Channel_BanUser_Unban: String { return self._s[233]! } - public var Stickers_GroupChooseStickerPack: String { return self._s[234]! } - public var Group_Setup_TypePrivate: String { return self._s[235]! } - public var Passport_Language_cs: String { return self._s[236]! } - public var Settings_LogoutConfirmationTitle: String { return self._s[237]! } - public var UserInfo_FirstNamePlaceholder: String { return self._s[238]! } - public var Passport_Identity_SurnamePlaceholder: String { return self._s[239]! } - public var Passport_Identity_FilesView: String { return self._s[240]! } - public var LoginPassword_ResetAccount: String { return self._s[241]! } - public var Privacy_GroupsAndChannels_AlwaysAllow: String { return self._s[242]! } + public var AccessDenied_PhotosRestricted: String { return self._s[217]! } + public var Map_Locating: String { return self._s[218]! } + public var AutoDownloadSettings_Unlimited: String { return self._s[219]! } + public var Passport_Language_km: String { return self._s[220]! } + public var MediaPicker_LivePhotoDescription: String { return self._s[221]! } + public var Passport_DiscardMessageDescription: String { return self._s[222]! } + public var SocksProxySetup_Title: String { return self._s[225]! } + public var SharedMedia_EmptyMusicText: String { return self._s[226]! } + public var Cache_ByPeerHeader: String { return self._s[228]! } + public var Bot_GroupStatusReadsHistory: String { return self._s[229]! } + public var TwoStepAuth_ResetAccountConfirmation: String { return self._s[230]! } + public var CallSettings_Always: String { return self._s[231]! } + public var Message_ImageExpired: String { return self._s[232]! } + public var Channel_BanUser_Unban: String { return self._s[234]! } + public var Stickers_GroupChooseStickerPack: String { return self._s[235]! } + public var Group_Setup_TypePrivate: String { return self._s[236]! } + public var Passport_Language_cs: String { return self._s[237]! } + public var Settings_LogoutConfirmationTitle: String { return self._s[238]! } + public var UserInfo_FirstNamePlaceholder: String { return self._s[239]! } + public var Passport_Identity_SurnamePlaceholder: String { return self._s[240]! } + public var Passport_Identity_FilesView: String { return self._s[241]! } + public var LoginPassword_ResetAccount: String { return self._s[242]! } + public var Privacy_GroupsAndChannels_AlwaysAllow: String { return self._s[243]! } public func Notification_JoinedChat(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[244]!, self._r[244]!, [_0]) + return formatWithArgumentRanges(self._s[245]!, self._r[245]!, [_0]) } - public var Notifications_ExceptionsUnmuted: String { return self._s[245]! } - public var ChannelInfo_DeleteChannel: String { return self._s[246]! } - public var Passport_Title: String { return self._s[248]! } - public var NetworkUsageSettings_BytesReceived: String { return self._s[249]! } - public var BlockedUsers_BlockTitle: String { return self._s[250]! } - public var Update_Title: String { return self._s[252]! } - public var AccessDenied_PhotosAndVideos: String { return self._s[253]! } - public var Channel_Username_Title: String { return self._s[254]! } + public var Notifications_ExceptionsUnmuted: String { return self._s[246]! } + public var ChannelInfo_DeleteChannel: String { return self._s[247]! } + public var Passport_Title: String { return self._s[249]! } + public var NetworkUsageSettings_BytesReceived: String { return self._s[250]! } + public var BlockedUsers_BlockTitle: String { return self._s[251]! } + public var Update_Title: String { return self._s[253]! } + public var AccessDenied_PhotosAndVideos: String { return self._s[254]! } + public var Channel_Username_Title: String { return self._s[255]! } public func Channel_AdminLog_MessageToggleSignaturesOn(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[255]!, self._r[255]!, [_0]) + return formatWithArgumentRanges(self._s[256]!, self._r[256]!, [_0]) } - public var Map_PullUpForPlaces: String { return self._s[256]! } + public var Map_PullUpForPlaces: String { return self._s[257]! } public func Conversation_EncryptionWaiting(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[257]!, self._r[257]!, [_0]) + return formatWithArgumentRanges(self._s[258]!, self._r[258]!, [_0]) } - public var Passport_Language_ka: String { return self._s[258]! } - public var InfoPlist_NSSiriUsageDescription: String { return self._s[259]! } - public var Calls_NotNow: String { return self._s[260]! } - public var Conversation_Report: String { return self._s[261]! } + public var Passport_Language_ka: String { return self._s[259]! } + public var InfoPlist_NSSiriUsageDescription: String { return self._s[260]! } + public var Calls_NotNow: String { return self._s[261]! } + public var Conversation_Report: String { return self._s[262]! } public func CHANNEL_MESSAGE_DOC(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[262]!, self._r[262]!, [_1]) + return formatWithArgumentRanges(self._s[263]!, self._r[263]!, [_1]) } - public var Channel_AdminLogFilter_EventsAll: String { return self._s[263]! } - public var InfoPlist_NSLocationWhenInUseUsageDescription: String { return self._s[264]! } - public var Passport_Address_TypeTemporaryRegistration: String { return self._s[265]! } - public var TwoStepAuth_EmailChangeSuccess: String { return self._s[268]! } - public var Call_ConnectionErrorTitle: String { return self._s[269]! } - public var Passport_Language_tr: String { return self._s[270]! } - public var Settings_ApplyProxyAlertEnable: String { return self._s[273]! } - public var Settings_ChatSettings: String { return self._s[274]! } - public var Group_About_Help: String { return self._s[275]! } + public var Channel_AdminLogFilter_EventsAll: String { return self._s[264]! } + public var InfoPlist_NSLocationWhenInUseUsageDescription: String { return self._s[265]! } + public var Passport_Address_TypeTemporaryRegistration: String { return self._s[266]! } + public var TwoStepAuth_EmailChangeSuccess: String { return self._s[269]! } + public var Call_ConnectionErrorTitle: String { return self._s[270]! } + public var Passport_Language_tr: String { return self._s[271]! } + public var Settings_ApplyProxyAlertEnable: String { return self._s[274]! } + public var Settings_ChatSettings: String { return self._s[275]! } + public var Group_About_Help: String { return self._s[276]! } public func CHANNEL_MESSAGE_NOTEXT(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[276]!, self._r[276]!, [_1]) + return formatWithArgumentRanges(self._s[277]!, self._r[277]!, [_1]) } - public var Month_GenSeptember: String { return self._s[277]! } - public var PrivacySettings_LastSeenEverybody: String { return self._s[278]! } - public var Contacts_NotRegisteredSection: String { return self._s[279]! } - public var PhotoEditor_BlurToolRadial: String { return self._s[280]! } - public var TwoStepAuth_PasswordRemoveConfirmation: String { return self._s[281]! } - public var Channel_EditAdmin_PermissionEditMessages: String { return self._s[284]! } - public var TwoStepAuth_ChangePassword: String { return self._s[285]! } - public var Watch_MessageView_Title: String { return self._s[286]! } + public var Month_GenSeptember: String { return self._s[278]! } + public var PrivacySettings_LastSeenEverybody: String { return self._s[279]! } + public var Contacts_NotRegisteredSection: String { return self._s[280]! } + public var PhotoEditor_BlurToolRadial: String { return self._s[281]! } + public var TwoStepAuth_PasswordRemoveConfirmation: String { return self._s[282]! } + public var Channel_EditAdmin_PermissionEditMessages: String { return self._s[285]! } + public var TwoStepAuth_ChangePassword: String { return self._s[286]! } + public var Watch_MessageView_Title: String { return self._s[287]! } public func Notification_PinnedRoundMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[287]!, self._r[287]!, [_0]) + return formatWithArgumentRanges(self._s[288]!, self._r[288]!, [_0]) } - public var Conversation_ViewMessage: String { return self._s[288]! } - public var Passport_FieldEmailHelp: String { return self._s[289]! } - public var Settings_SaveEditedPhotos: String { return self._s[290]! } - public var Channel_Management_LabelCreator: String { return self._s[291]! } + public var Conversation_ViewMessage: String { return self._s[289]! } + public var Passport_FieldEmailHelp: String { return self._s[290]! } + public var Settings_SaveEditedPhotos: String { return self._s[291]! } + public var Channel_Management_LabelCreator: String { return self._s[292]! } public func Notification_PinnedStickerMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[292]!, self._r[292]!, [_0]) - } - public func AutoNightTheme_AutomaticHelp(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[293]!, self._r[293]!, [_0]) } - public var Passport_Address_EditPassportRegistration: String { return self._s[295]! } - public var PhotoEditor_QualityTool: String { return self._s[296]! } - public var Login_NetworkError: String { return self._s[297]! } - public var TwoStepAuth_EnterPasswordForgot: String { return self._s[298]! } - public var Compose_ChannelMembers: String { return self._s[300]! } + public func AutoNightTheme_AutomaticHelp(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[294]!, self._r[294]!, [_0]) + } + public var Passport_Address_EditPassportRegistration: String { return self._s[296]! } + public var PhotoEditor_QualityTool: String { return self._s[297]! } + public var Login_NetworkError: String { return self._s[298]! } + public var TwoStepAuth_EnterPasswordForgot: String { return self._s[299]! } + public var Compose_ChannelMembers: String { return self._s[301]! } public func Channel_AdminLog_CaptionEdited(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[301]!, self._r[301]!, [_0]) + return formatWithArgumentRanges(self._s[302]!, self._r[302]!, [_0]) } - public var Common_Yes: String { return self._s[302]! } - public var KeyCommand_JumpToPreviousUnreadChat: String { return self._s[303]! } - public var CheckoutInfo_ReceiverInfoPhone: String { return self._s[304]! } - public var SocksProxySetup_TypeNone: String { return self._s[305]! } - public var GroupInfo_AddParticipantTitle: String { return self._s[307]! } - public var Map_LiveLocationShowAll: String { return self._s[308]! } - public var Settings_SavedMessages: String { return self._s[309]! } - public var Passport_FieldIdentitySelfieHelp: String { return self._s[310]! } + public var Common_Yes: String { return self._s[303]! } + public var KeyCommand_JumpToPreviousUnreadChat: String { return self._s[304]! } + public var CheckoutInfo_ReceiverInfoPhone: String { return self._s[305]! } + public var SocksProxySetup_TypeNone: String { return self._s[306]! } + public var GroupInfo_AddParticipantTitle: String { return self._s[308]! } + public var Map_LiveLocationShowAll: String { return self._s[309]! } + public var Settings_SavedMessages: String { return self._s[310]! } + public var Passport_FieldIdentitySelfieHelp: String { return self._s[311]! } public func CHANNEL_MESSAGE_TEXT(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[312]!, self._r[312]!, [_1, _2]) + return formatWithArgumentRanges(self._s[313]!, self._r[313]!, [_1, _2]) } - public var Checkout_PayNone: String { return self._s[313]! } - public var CheckoutInfo_ErrorNameInvalid: String { return self._s[314]! } - public var Notification_PaymentSent: String { return self._s[315]! } - public var Settings_Username: String { return self._s[316]! } - public var Notification_CallMissedShort: String { return self._s[317]! } - public var Call_CallInProgressTitle: String { return self._s[318]! } - public var Passport_Scans: String { return self._s[320]! } - public var PhotoEditor_Skip: String { return self._s[322]! } - public var AuthSessions_TerminateOtherSessionsHelp: String { return self._s[323]! } - public var Call_AudioRouteHeadphones: String { return self._s[324]! } - public var SocksProxySetup_UseForCalls: String { return self._s[325]! } - public var Contacts_InviteFriends: String { return self._s[326]! } - public var Channel_BanUser_PermissionSendMessages: String { return self._s[327]! } - public var Notifications_InAppNotificationsVibrate: String { return self._s[328]! } - public var StickerPack_Share: String { return self._s[329]! } - public var Watch_MessageView_Reply: String { return self._s[330]! } - public var Call_AudioRouteSpeaker: String { return self._s[331]! } - public var Checkout_Title: String { return self._s[335]! } + public var Checkout_PayNone: String { return self._s[314]! } + public var CheckoutInfo_ErrorNameInvalid: String { return self._s[315]! } + public var Notification_PaymentSent: String { return self._s[316]! } + public var Settings_Username: String { return self._s[317]! } + public var Notification_CallMissedShort: String { return self._s[318]! } + public var Call_CallInProgressTitle: String { return self._s[319]! } + public var Passport_Scans: String { return self._s[321]! } + public var PhotoEditor_Skip: String { return self._s[323]! } + public var AuthSessions_TerminateOtherSessionsHelp: String { return self._s[324]! } + public var Call_AudioRouteHeadphones: String { return self._s[325]! } + public var SocksProxySetup_UseForCalls: String { return self._s[326]! } + public var Contacts_InviteFriends: String { return self._s[327]! } + public var Channel_BanUser_PermissionSendMessages: String { return self._s[328]! } + public var Notifications_InAppNotificationsVibrate: String { return self._s[329]! } + public var StickerPack_Share: String { return self._s[330]! } + public var Watch_MessageView_Reply: String { return self._s[331]! } + public var Call_AudioRouteSpeaker: String { return self._s[332]! } + public var Checkout_Title: String { return self._s[336]! } public func MESSAGE_GEO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[336]!, self._r[336]!, [_1]) + return formatWithArgumentRanges(self._s[337]!, self._r[337]!, [_1]) } - public var Privacy_Calls: String { return self._s[337]! } - public var DialogList_AdLabel: String { return self._s[338]! } - public var Passport_Identity_ScansHelp: String { return self._s[339]! } - public var Channel_AdminLogFilter_EventsInfo: String { return self._s[340]! } - public var Passport_Language_hu: String { return self._s[341]! } + public var Privacy_Calls: String { return self._s[338]! } + public var DialogList_AdLabel: String { return self._s[339]! } + public var Passport_Identity_ScansHelp: String { return self._s[340]! } + public var Channel_AdminLogFilter_EventsInfo: String { return self._s[341]! } + public var Passport_Language_hu: String { return self._s[342]! } public func Channel_AdminLog_MessagePinned(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[342]!, self._r[342]!, [_0]) - } - public func Channel_AdminLog_MessageToggleInvitesOn(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[343]!, self._r[343]!, [_0]) } - public var KeyCommand_ScrollDown: String { return self._s[345]! } - public var Conversation_LinkDialogSave: String { return self._s[346]! } - public var CheckoutInfo_ErrorShippingNotAvailable: String { return self._s[348]! } - public var Conversation_SendMessageErrorFlood: String { return self._s[350]! } + public func Channel_AdminLog_MessageToggleInvitesOn(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[344]!, self._r[344]!, [_0]) + } + public var KeyCommand_ScrollDown: String { return self._s[346]! } + public var Conversation_LinkDialogSave: String { return self._s[347]! } + public var CheckoutInfo_ErrorShippingNotAvailable: String { return self._s[349]! } + public var Conversation_SendMessageErrorFlood: String { return self._s[351]! } public func Checkout_SavePasswordTimeoutAndTouchId(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[351]!, self._r[351]!, [_0]) + return formatWithArgumentRanges(self._s[352]!, self._r[352]!, [_0]) } - public var HashtagSearch_AllChats: String { return self._s[352]! } - public var InfoPlist_NSPhotoLibraryAddUsageDescription: String { return self._s[353]! } + public var HashtagSearch_AllChats: String { return self._s[353]! } + public var InfoPlist_NSPhotoLibraryAddUsageDescription: String { return self._s[354]! } public func Date_ChatDateHeaderYear(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[356]!, self._r[356]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[357]!, self._r[357]!, [_1, _2, _3]) } - public var Privacy_Calls_P2PContacts: String { return self._s[357]! } - public var Passport_Email_Delete: String { return self._s[358]! } - public var CheckoutInfo_ShippingInfoCountry: String { return self._s[359]! } - public var Map_ShowPlaces: String { return self._s[360]! } - public var Passport_Identity_GenderFemale: String { return self._s[361]! } - public var ApplyLanguage_ChangeLanguageAction: String { return self._s[362]! } - public var Camera_VideoMode: String { return self._s[363]! } + public var Privacy_Calls_P2PContacts: String { return self._s[358]! } + public var Passport_Email_Delete: String { return self._s[359]! } + public var CheckoutInfo_ShippingInfoCountry: String { return self._s[360]! } + public var Map_ShowPlaces: String { return self._s[361]! } + public var Passport_Identity_GenderFemale: String { return self._s[362]! } + public var ApplyLanguage_ChangeLanguageAction: String { return self._s[363]! } + public var Permissions_SiriText: String { return self._s[364]! } + public var Camera_VideoMode: String { return self._s[365]! } public func Watch_Time_ShortFullAt(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[364]!, self._r[364]!, [_1, _2]) + return formatWithArgumentRanges(self._s[366]!, self._r[366]!, [_1, _2]) } - public var UserInfo_TelegramCall: String { return self._s[367]! } - public var PrivacyLastSeenSettings_CustomShareSettingsHelp: String { return self._s[368]! } - public var Passport_UpdateRequiredError: String { return self._s[370]! } - public var Channel_AdminLog_InfoPanelAlertText: String { return self._s[373]! } + public var UserInfo_TelegramCall: String { return self._s[369]! } + public var PrivacyLastSeenSettings_CustomShareSettingsHelp: String { return self._s[370]! } + public var Passport_UpdateRequiredError: String { return self._s[372]! } + public var Channel_AdminLog_InfoPanelAlertText: String { return self._s[375]! } public func Channel_AdminLog_MessageUnpinned(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[375]!, self._r[375]!, [_0]) + return formatWithArgumentRanges(self._s[377]!, self._r[377]!, [_0]) } - public var Cache_Photos: String { return self._s[376]! } - public var Message_PinnedStickerMessage: String { return self._s[377]! } - public var PhotoEditor_QualityMedium: String { return self._s[378]! } - public var Privacy_PaymentsClearInfo: String { return self._s[379]! } - public var PhotoEditor_CurvesRed: String { return self._s[381]! } - public var Passport_Identity_AddPersonalDetails: String { return self._s[382]! } + public var Cache_Photos: String { return self._s[378]! } + public var Message_PinnedStickerMessage: String { return self._s[379]! } + public var PhotoEditor_QualityMedium: String { return self._s[380]! } + public var Privacy_PaymentsClearInfo: String { return self._s[381]! } + public var PhotoEditor_CurvesRed: String { return self._s[383]! } + public var Passport_Identity_AddPersonalDetails: String { return self._s[384]! } public func Login_WillCallYou(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[384]!, self._r[384]!, [_0]) + return formatWithArgumentRanges(self._s[386]!, self._r[386]!, [_0]) } - public var Privacy_PaymentsTitle: String { return self._s[385]! } - public var SocksProxySetup_ProxyType: String { return self._s[386]! } + public var Privacy_PaymentsTitle: String { return self._s[387]! } + public var SocksProxySetup_ProxyType: String { return self._s[388]! } public func Time_PreciseDate_m8(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[387]!, self._r[387]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[389]!, self._r[389]!, [_1, _2, _3]) } - public var Login_PhoneNumberHelp: String { return self._s[388]! } - public var User_DeletedAccount: String { return self._s[390]! } - public var Call_StatusFailed: String { return self._s[391]! } + public var Login_PhoneNumberHelp: String { return self._s[390]! } + public var User_DeletedAccount: String { return self._s[392]! } + public var Call_StatusFailed: String { return self._s[393]! } public func Notification_GroupInviter(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[392]!, self._r[392]!, [_0]) + return formatWithArgumentRanges(self._s[394]!, self._r[394]!, [_0]) } - public var Localization_ChooseLanguage: String { return self._s[393]! } - public var CheckoutInfo_ShippingInfoAddress2Placeholder: String { return self._s[394]! } + public var Localization_ChooseLanguage: String { return self._s[395]! } + public var CheckoutInfo_ShippingInfoAddress2Placeholder: String { return self._s[396]! } public func Notification_SecretChatMessageScreenshot(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[395]!, self._r[395]!, [_0]) + return formatWithArgumentRanges(self._s[397]!, self._r[397]!, [_0]) } public func DialogList_SingleUploadingPhotoSuffix(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[396]!, self._r[396]!, [_0]) + return formatWithArgumentRanges(self._s[398]!, self._r[398]!, [_0]) } - public var Channel_LeaveChannel: String { return self._s[397]! } - public var Compose_NewGroup: String { return self._s[399]! } - public var TwoStepAuth_EmailPlaceholder: String { return self._s[400]! } - public var PhotoEditor_ExposureTool: String { return self._s[401]! } - public var Conversation_ViewChannel: String { return self._s[402]! } - public var ChatAdmins_AdminLabel: String { return self._s[405]! } - public var Contacts_FailedToSendInvitesMessage: String { return self._s[406]! } - public var Login_Code: String { return self._s[407]! } - public var Passport_Identity_ExpiryDateNone: String { return self._s[408]! } - public var ContactInfo_PhoneLabelWorkFax: String { return self._s[409]! } - public var AuthSessions_IncompleteAttemptsInfo: String { return self._s[410]! } - public var Channel_Username_InvalidCharacters: String { return self._s[413]! } - public var FeatureDisabled_Oops: String { return self._s[414]! } - public var Calls_CallTabTitle: String { return self._s[415]! } - public var ShareMenu_Send: String { return self._s[416]! } - public var WatchRemote_AlertTitle: String { return self._s[417]! } - public var Channel_Members_AddBannedErrorAdmin: String { return self._s[418]! } - public var Conversation_InfoGroup: String { return self._s[419]! } - public var Passport_Identity_TypePersonalDetails: String { return self._s[420]! } - public var Passport_Identity_OneOfTypePassport: String { return self._s[421]! } - public var Checkout_Phone: String { return self._s[422]! } - public var Channel_SignMessages_Help: String { return self._s[424]! } - public var Passport_PasswordNext: String { return self._s[425]! } - public var Calls_SubmitRating: String { return self._s[426]! } - public var Camera_FlashOn: String { return self._s[427]! } - public var Watch_MessageView_Forward: String { return self._s[428]! } - public var Passport_DiscardMessageTitle: String { return self._s[430]! } - public var Passport_Language_uk: String { return self._s[431]! } - public var GroupInfo_ActionPromote: String { return self._s[432]! } - public var DialogList_You: String { return self._s[433]! } - public var Weekday_Monday: String { return self._s[434]! } - public var Passport_Identity_SelfieHelp: String { return self._s[435]! } - public var Passport_Identity_MiddleName: String { return self._s[437]! } - public var AccessDenied_Camera: String { return self._s[438]! } - public var WatchRemote_NotificationText: String { return self._s[439]! } - public var SharedMedia_ViewInChat: String { return self._s[440]! } - public var Passcode_AppLockedAlert: String { return self._s[441]! } - public var Activity_RecordingAudio: String { return self._s[444]! } - public var Watch_Stickers_StickerPacks: String { return self._s[445]! } + public var Channel_LeaveChannel: String { return self._s[399]! } + public var Compose_NewGroup: String { return self._s[401]! } + public var TwoStepAuth_EmailPlaceholder: String { return self._s[402]! } + public var PhotoEditor_ExposureTool: String { return self._s[403]! } + public var Conversation_ViewChannel: String { return self._s[404]! } + public var ChatAdmins_AdminLabel: String { return self._s[407]! } + public var Contacts_FailedToSendInvitesMessage: String { return self._s[408]! } + public var Login_Code: String { return self._s[409]! } + public var Passport_Identity_ExpiryDateNone: String { return self._s[410]! } + public var ContactInfo_PhoneLabelWorkFax: String { return self._s[411]! } + public var AuthSessions_IncompleteAttemptsInfo: String { return self._s[412]! } + public var Channel_Username_InvalidCharacters: String { return self._s[415]! } + public var FeatureDisabled_Oops: String { return self._s[416]! } + public var Calls_CallTabTitle: String { return self._s[417]! } + public var ShareMenu_Send: String { return self._s[418]! } + public var WatchRemote_AlertTitle: String { return self._s[419]! } + public var Channel_Members_AddBannedErrorAdmin: String { return self._s[420]! } + public var Conversation_InfoGroup: String { return self._s[421]! } + public var Passport_Identity_TypePersonalDetails: String { return self._s[422]! } + public var Passport_Identity_OneOfTypePassport: String { return self._s[423]! } + public var Checkout_Phone: String { return self._s[424]! } + public var Channel_SignMessages_Help: String { return self._s[426]! } + public var Passport_PasswordNext: String { return self._s[427]! } + public var Calls_SubmitRating: String { return self._s[428]! } + public var Camera_FlashOn: String { return self._s[429]! } + public var Watch_MessageView_Forward: String { return self._s[430]! } + public var Passport_DiscardMessageTitle: String { return self._s[432]! } + public var Passport_Language_uk: String { return self._s[433]! } + public var GroupInfo_ActionPromote: String { return self._s[434]! } + public var DialogList_You: String { return self._s[435]! } + public var Weekday_Monday: String { return self._s[436]! } + public var Passport_Identity_SelfieHelp: String { return self._s[437]! } + public var Passport_Identity_MiddleName: String { return self._s[439]! } + public var AccessDenied_Camera: String { return self._s[440]! } + public var WatchRemote_NotificationText: String { return self._s[441]! } + public var SharedMedia_ViewInChat: String { return self._s[442]! } + public var Passcode_AppLockedAlert: String { return self._s[443]! } + public var Activity_RecordingAudio: String { return self._s[446]! } + public var Watch_Stickers_StickerPacks: String { return self._s[447]! } public func Target_ShareGameConfirmationPrivate(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[446]!, self._r[446]!, [_0]) + return formatWithArgumentRanges(self._s[448]!, self._r[448]!, [_0]) } - public var Checkout_NewCard_PostcodePlaceholder: String { return self._s[447]! } - public var Passport_Identity_OneOfTypeInternalPassport: String { return self._s[448]! } - public var DialogList_DeleteConversationConfirmation: String { return self._s[449]! } - public var AttachmentMenu_SendAsFile: String { return self._s[450]! } - public var Watch_Conversation_Unblock: String { return self._s[453]! } - public var Channel_AdminLog_MessagePreviousLink: String { return self._s[454]! } - public var TextFormat_Monospace: String { return self._s[455]! } - public var Conversation_ContextMenuCopy: String { return self._s[456]! } - public var GroupInfo_UpgradeButton: String { return self._s[457]! } - public var PrivacyLastSeenSettings_NeverShareWith: String { return self._s[459]! } - public var ConvertToSupergroup_HelpText: String { return self._s[461]! } - public var MediaPicker_VideoMuteDescription: String { return self._s[462]! } - public var Passport_Address_TypeRentalAgreement: String { return self._s[463]! } - public var Passport_Language_it: String { return self._s[465]! } - public var UserInfo_ShareMyContactInfo: String { return self._s[466]! } - public var Channel_Info_Stickers: String { return self._s[467]! } - public var Appearance_ColorTheme: String { return self._s[468]! } + public var Checkout_NewCard_PostcodePlaceholder: String { return self._s[449]! } + public var Passport_Identity_OneOfTypeInternalPassport: String { return self._s[450]! } + public var DialogList_DeleteConversationConfirmation: String { return self._s[451]! } + public var AttachmentMenu_SendAsFile: String { return self._s[452]! } + public var Watch_Conversation_Unblock: String { return self._s[455]! } + public var Channel_AdminLog_MessagePreviousLink: String { return self._s[456]! } + public var TextFormat_Monospace: String { return self._s[457]! } + public var Conversation_ContextMenuCopy: String { return self._s[458]! } + public var GroupInfo_UpgradeButton: String { return self._s[459]! } + public var PrivacyLastSeenSettings_NeverShareWith: String { return self._s[461]! } + public var ConvertToSupergroup_HelpText: String { return self._s[463]! } + public var MediaPicker_VideoMuteDescription: String { return self._s[464]! } + public var Passport_Address_TypeRentalAgreement: String { return self._s[465]! } + public var Passport_Language_it: String { return self._s[467]! } + public var UserInfo_ShareMyContactInfo: String { return self._s[468]! } + public var Channel_Info_Stickers: String { return self._s[469]! } + public var Appearance_ColorTheme: String { return self._s[470]! } public func FileSize_GB(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[470]!, self._r[470]!, [_0]) + return formatWithArgumentRanges(self._s[472]!, self._r[472]!, [_0]) } public func Passport_FieldOneOf_Or(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[472]!, self._r[472]!, [_1, _2]) + return formatWithArgumentRanges(self._s[474]!, self._r[474]!, [_1, _2]) } - public var Month_ShortJanuary: String { return self._s[474]! } - public var Channel_BanUser_PermissionsHeader: String { return self._s[475]! } - public var PhotoEditor_QualityVeryHigh: String { return self._s[476]! } - public var Passport_Language_mk: String { return self._s[477]! } - public var AuthSessions_IncompleteAttempts: String { return self._s[478]! } - public var Login_TermsOfServiceLabel: String { return self._s[479]! } + public var Month_ShortJanuary: String { return self._s[476]! } + public var Channel_BanUser_PermissionsHeader: String { return self._s[477]! } + public var PhotoEditor_QualityVeryHigh: String { return self._s[478]! } + public var Passport_Language_mk: String { return self._s[479]! } + public var AuthSessions_IncompleteAttempts: String { return self._s[480]! } + public var Login_TermsOfServiceLabel: String { return self._s[481]! } public func InstantPage_RelatedArticleAuthorAndDateTitle(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[480]!, self._r[480]!, [_1, _2]) - } - public func MESSAGE_TEXT(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[482]!, self._r[482]!, [_1, _2]) } - public var DialogList_NoMessagesTitle: String { return self._s[483]! } - public var Passport_DeletePassportConfirmation: String { return self._s[484]! } - public var Passport_Language_az: String { return self._s[486]! } - public var AccessDenied_Contacts: String { return self._s[487]! } - public var Your_cards_security_code_is_invalid: String { return self._s[488]! } - public var Contacts_InviteSearchLabel: String { return self._s[489]! } - public var Tour_StartButton: String { return self._s[490]! } - public var CheckoutInfo_Title: String { return self._s[492]! } - public var Conversation_Admin: String { return self._s[493]! } + public func MESSAGE_TEXT(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[484]!, self._r[484]!, [_1, _2]) + } + public var DialogList_NoMessagesTitle: String { return self._s[485]! } + public var Passport_DeletePassportConfirmation: String { return self._s[486]! } + public var Permissions_CellularDataText: String { return self._s[488]! } + public var Passport_Language_az: String { return self._s[489]! } + public var AccessDenied_Contacts: String { return self._s[490]! } + public var Your_cards_security_code_is_invalid: String { return self._s[491]! } + public var Contacts_InviteSearchLabel: String { return self._s[492]! } + public var Tour_StartButton: String { return self._s[493]! } + public var CheckoutInfo_Title: String { return self._s[495]! } + public var Conversation_Admin: String { return self._s[496]! } public func Channel_AdminLog_MessageRestrictedNameUsername(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[495]!, self._r[495]!, [_1, _2]) + return formatWithArgumentRanges(self._s[498]!, self._r[498]!, [_1, _2]) } - public var ChangePhoneNumberCode_Help: String { return self._s[496]! } - public var Web_Error: String { return self._s[497]! } - public var ShareFileTip_Title: String { return self._s[498]! } - public var Privacy_SecretChatsLinkPreviews: String { return self._s[499]! } - public var Username_InvalidStartsWithNumber: String { return self._s[500]! } + public var ChangePhoneNumberCode_Help: String { return self._s[499]! } + public var Web_Error: String { return self._s[500]! } + public var ShareFileTip_Title: String { return self._s[501]! } + public var Privacy_SecretChatsLinkPreviews: String { return self._s[502]! } + public var Username_InvalidStartsWithNumber: String { return self._s[503]! } public func DialogList_EncryptedChatStartedIncoming(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[502]!, self._r[502]!, [_0]) + return formatWithArgumentRanges(self._s[505]!, self._r[505]!, [_0]) } - public var Calls_AddTab: String { return self._s[504]! } - public var DialogList_AdNoticeAlert: String { return self._s[505]! } - public var PhotoEditor_TiltShift: String { return self._s[508]! } - public var Passport_Identity_TypeDriversLicenseUploadScan: String { return self._s[509]! } - public var ChannelMembers_WhoCanAddMembers_Admins: String { return self._s[510]! } - public var Tour_Text5: String { return self._s[511]! } - public var Notifications_ExceptionsGroupPlaceholder: String { return self._s[512]! } - public var Watch_Stickers_RecentPlaceholder: String { return self._s[513]! } - public var Common_Select: String { return self._s[514]! } + public var Calls_AddTab: String { return self._s[507]! } + public var DialogList_AdNoticeAlert: String { return self._s[508]! } + public var PhotoEditor_TiltShift: String { return self._s[511]! } + public var Passport_Identity_TypeDriversLicenseUploadScan: String { return self._s[512]! } + public var ChannelMembers_WhoCanAddMembers_Admins: String { return self._s[513]! } + public var Tour_Text5: String { return self._s[514]! } + public var Notifications_ExceptionsGroupPlaceholder: String { return self._s[515]! } + public var Watch_Stickers_RecentPlaceholder: String { return self._s[516]! } + public var Common_Select: String { return self._s[517]! } public func Notification_MessageLifetimeRemoved(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[515]!, self._r[515]!, [_1]) + return formatWithArgumentRanges(self._s[518]!, self._r[518]!, [_1]) } public func PINNED_INVOICE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[516]!, self._r[516]!, [_1]) + return formatWithArgumentRanges(self._s[519]!, self._r[519]!, [_1]) } - public var Month_GenFebruary: String { return self._s[517]! } - public var Contacts_SelectAll: String { return self._s[518]! } - public var FastTwoStepSetup_EmailHelp: String { return self._s[519]! } - public var Month_GenOctober: String { return self._s[520]! } - public var CheckoutInfo_ErrorPhoneInvalid: String { return self._s[521]! } - public var Passport_Identity_DocumentNumberPlaceholder: String { return self._s[522]! } - public var AutoNightTheme_UpdateLocation: String { return self._s[523]! } - public var Group_Setup_TypePublic: String { return self._s[525]! } - public var Checkout_PaymentMethod_New: String { return self._s[526]! } - public var ShareMenu_Comment: String { return self._s[527]! } - public var Passport_FloodError: String { return self._s[528]! } - public var Channel_Management_LabelEditor: String { return self._s[529]! } - public var TwoStepAuth_SetPasswordHelp: String { return self._s[530]! } - public var Channel_AdminLogFilter_EventsTitle: String { return self._s[531]! } - public var NotificationSettings_ContactJoined: String { return self._s[533]! } - public var ChatSettings_AutoDownloadVideos: String { return self._s[534]! } - public var Passport_Identity_TypeIdentityCard: String { return self._s[536]! } - public var Username_LinkCopied: String { return self._s[538]! } + public var Month_GenFebruary: String { return self._s[520]! } + public var Contacts_SelectAll: String { return self._s[521]! } + public var FastTwoStepSetup_EmailHelp: String { return self._s[522]! } + public var Month_GenOctober: String { return self._s[523]! } + public var CheckoutInfo_ErrorPhoneInvalid: String { return self._s[524]! } + public var Passport_Identity_DocumentNumberPlaceholder: String { return self._s[525]! } + public var AutoNightTheme_UpdateLocation: String { return self._s[526]! } + public var Permissions_Skip: String { return self._s[527]! } + public var Group_Setup_TypePublic: String { return self._s[529]! } + public var Checkout_PaymentMethod_New: String { return self._s[530]! } + public var ShareMenu_Comment: String { return self._s[531]! } + public var Passport_FloodError: String { return self._s[532]! } + public var Channel_Management_LabelEditor: String { return self._s[533]! } + public var TwoStepAuth_SetPasswordHelp: String { return self._s[534]! } + public var Channel_AdminLogFilter_EventsTitle: String { return self._s[535]! } + public var NotificationSettings_ContactJoined: String { return self._s[537]! } + public var ChatSettings_AutoDownloadVideos: String { return self._s[538]! } + public var Passport_Identity_TypeIdentityCard: String { return self._s[540]! } + public var Username_LinkCopied: String { return self._s[542]! } public func Time_MonthOfYear_m9(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[539]!, self._r[539]!, [_0]) + return formatWithArgumentRanges(self._s[543]!, self._r[543]!, [_0]) } - public var Channel_EditAdmin_PermissionAddAdmins: String { return self._s[541]! } - public var Passport_FieldPhoneHelp: String { return self._s[542]! } - public var Conversation_SendMessage: String { return self._s[543]! } - public var Notification_CallIncoming: String { return self._s[544]! } + public var Permissions_CellularDataAllowInSettings: String { return self._s[544]! } + public var Channel_EditAdmin_PermissionAddAdmins: String { return self._s[546]! } + public var Passport_FieldPhoneHelp: String { return self._s[547]! } + public var Conversation_SendMessage: String { return self._s[548]! } + public var Notification_CallIncoming: String { return self._s[549]! } public func MESSAGE_FWDS(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[545]!, self._r[545]!, [_1, _2]) + return formatWithArgumentRanges(self._s[550]!, self._r[550]!, [_1, _2]) } - public var Map_OpenInYandexMaps: String { return self._s[548]! } - public var FastTwoStepSetup_PasswordHelp: String { return self._s[549]! } - public var GroupInfo_GroupHistoryHidden: String { return self._s[550]! } - public var AutoNightTheme_UseSunsetSunrise: String { return self._s[551]! } - public var Month_ShortNovember: String { return self._s[552]! } - public var AccessDenied_Settings: String { return self._s[555]! } - public var EncryptionKey_Title: String { return self._s[556]! } - public var Profile_MessageLifetime1h: String { return self._s[557]! } + public var Map_OpenInYandexMaps: String { return self._s[553]! } + public var FastTwoStepSetup_PasswordHelp: String { return self._s[554]! } + public var GroupInfo_GroupHistoryHidden: String { return self._s[555]! } + public var AutoNightTheme_UseSunsetSunrise: String { return self._s[556]! } + public var Month_ShortNovember: String { return self._s[557]! } + public var AccessDenied_Settings: String { return self._s[560]! } + public var EncryptionKey_Title: String { return self._s[561]! } + public var Profile_MessageLifetime1h: String { return self._s[562]! } public func Map_DistanceAway(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[558]!, self._r[558]!, [_0]) + return formatWithArgumentRanges(self._s[563]!, self._r[563]!, [_0]) } - public var Checkout_ErrorPaymentFailed: String { return self._s[559]! } - public var Compose_NewMessage: String { return self._s[560]! } - public var Conversation_LiveLocationYou: String { return self._s[561]! } - public var Privacy_TopPeersHelp: String { return self._s[562]! } - public var Map_OpenInWaze: String { return self._s[563]! } - public var Checkout_ShippingMethod: String { return self._s[564]! } - public var Login_InfoFirstNamePlaceholder: String { return self._s[565]! } - public var Checkout_ErrorProviderAccountInvalid: String { return self._s[566]! } + public var Checkout_ErrorPaymentFailed: String { return self._s[564]! } + public var Compose_NewMessage: String { return self._s[565]! } + public var Conversation_LiveLocationYou: String { return self._s[566]! } + public var Privacy_TopPeersHelp: String { return self._s[567]! } + public var Map_OpenInWaze: String { return self._s[568]! } + public var Checkout_ShippingMethod: String { return self._s[569]! } + public var Login_InfoFirstNamePlaceholder: String { return self._s[570]! } + public var Checkout_ErrorProviderAccountInvalid: String { return self._s[571]! } public func Notification_Exceptions_Sound(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[567]!, self._r[567]!, [_0]) + return formatWithArgumentRanges(self._s[572]!, self._r[572]!, [_0]) } - public var CallSettings_TabIconDescription: String { return self._s[569]! } - public var ChatSettings_AutoDownloadReset: String { return self._s[570]! } - public var Checkout_WebConfirmation_Title: String { return self._s[571]! } - public var PasscodeSettings_AutoLock: String { return self._s[572]! } - public var Notifications_MessageNotificationsPreview: String { return self._s[575]! } - public var Conversation_BlockUser: String { return self._s[576]! } + public var CallSettings_TabIconDescription: String { return self._s[574]! } + public var ChatSettings_AutoDownloadReset: String { return self._s[575]! } + public var Checkout_WebConfirmation_Title: String { return self._s[576]! } + public var PasscodeSettings_AutoLock: String { return self._s[577]! } + public var Notifications_MessageNotificationsPreview: String { return self._s[580]! } + public var Conversation_BlockUser: String { return self._s[581]! } public func TwoStepAuth_SetupPendingEmail(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[577]!, self._r[577]!, [_0]) + return formatWithArgumentRanges(self._s[582]!, self._r[582]!, [_0]) } - public var Passport_Identity_EditPassport: String { return self._s[578]! } - public var MessageTimer_Custom: String { return self._s[579]! } - public var Conversation_SilentBroadcastTooltipOff: String { return self._s[581]! } - public var Conversation_Mute: String { return self._s[582]! } - public var CreateGroup_SoftUserLimitAlert: String { return self._s[583]! } - public var AccessDenied_LocationDenied: String { return self._s[584]! } - public var Tour_Title6: String { return self._s[585]! } - public var Settings_UsernameEmpty: String { return self._s[586]! } - public var PrivacySettings_TwoStepAuth: String { return self._s[587]! } - public var Conversation_FileICloudDrive: String { return self._s[588]! } - public var KeyCommand_SendMessage: String { return self._s[590]! } + public var Passport_Identity_EditPassport: String { return self._s[583]! } + public var MessageTimer_Custom: String { return self._s[584]! } + public var Conversation_SilentBroadcastTooltipOff: String { return self._s[586]! } + public var Conversation_Mute: String { return self._s[587]! } + public var CreateGroup_SoftUserLimitAlert: String { return self._s[588]! } + public var AccessDenied_LocationDenied: String { return self._s[589]! } + public var Tour_Title6: String { return self._s[590]! } + public var Settings_UsernameEmpty: String { return self._s[591]! } + public var PrivacySettings_TwoStepAuth: String { return self._s[592]! } + public var Conversation_FileICloudDrive: String { return self._s[593]! } + public var KeyCommand_SendMessage: String { return self._s[595]! } public func Channel_AdminLog_MessageDeleted(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[592]!, self._r[592]!, [_0]) + return formatWithArgumentRanges(self._s[597]!, self._r[597]!, [_0]) } - public var DialogList_DeleteBotConfirmation: String { return self._s[593]! } - public var EditProfile_Title: String { return self._s[594]! } - public var PasscodeSettings_HelpTop: String { return self._s[595]! } - public var SocksProxySetup_ProxySocks5: String { return self._s[596]! } - public var Common_TakePhotoOrVideo: String { return self._s[597]! } - public var Notification_MessageLifetime2s: String { return self._s[598]! } - public var Checkout_ErrorGeneric: String { return self._s[599]! } - public var DialogList_Unread: String { return self._s[601]! } - public var AutoNightTheme_Automatic: String { return self._s[602]! } - public var Passport_Identity_Name: String { return self._s[603]! } - public var Channel_AdminLog_CanBanUsers: String { return self._s[605]! } - public var Cache_Indexing: String { return self._s[606]! } + public var DialogList_DeleteBotConfirmation: String { return self._s[598]! } + public var EditProfile_Title: String { return self._s[599]! } + public var PasscodeSettings_HelpTop: String { return self._s[600]! } + public var SocksProxySetup_ProxySocks5: String { return self._s[601]! } + public var Common_TakePhotoOrVideo: String { return self._s[602]! } + public var Notification_MessageLifetime2s: String { return self._s[603]! } + public var Checkout_ErrorGeneric: String { return self._s[604]! } + public var DialogList_Unread: String { return self._s[606]! } + public var AutoNightTheme_Automatic: String { return self._s[607]! } + public var Passport_Identity_Name: String { return self._s[608]! } + public var Channel_AdminLog_CanBanUsers: String { return self._s[610]! } + public var Cache_Indexing: String { return self._s[611]! } public func ENCRYPTION_REQUEST(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[608]!, self._r[608]!, [_1]) + return formatWithArgumentRanges(self._s[613]!, self._r[613]!, [_1]) } - public var StickerSettings_ContextInfo: String { return self._s[609]! } - public var Channel_BanUser_PermissionEmbedLinks: String { return self._s[610]! } - public var Map_Location: String { return self._s[611]! } - public var GroupInfo_InviteLink_LinkSection: String { return self._s[612]! } + public var StickerSettings_ContextInfo: String { return self._s[614]! } + public var Channel_BanUser_PermissionEmbedLinks: String { return self._s[615]! } + public var Map_Location: String { return self._s[616]! } + public var GroupInfo_InviteLink_LinkSection: String { return self._s[617]! } public func Passport_Identity_UploadOneOfScan(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[613]!, self._r[613]!, [_0]) + return formatWithArgumentRanges(self._s[618]!, self._r[618]!, [_0]) } - public var Notification_PassportValuePhone: String { return self._s[614]! } - public var TwoStepAuth_PasswordChangeSuccess: String { return self._s[615]! } - public var Privacy_Calls_AlwaysAllow_Placeholder: String { return self._s[616]! } - public var CheckoutInfo_ShippingInfoPostcode: String { return self._s[617]! } - public var Group_Setup_HistoryVisibleHelp: String { return self._s[618]! } + public var Notification_PassportValuePhone: String { return self._s[619]! } + public var TwoStepAuth_PasswordChangeSuccess: String { return self._s[620]! } + public var Privacy_Calls_AlwaysAllow_Placeholder: String { return self._s[621]! } + public var CheckoutInfo_ShippingInfoPostcode: String { return self._s[622]! } + public var Group_Setup_HistoryVisibleHelp: String { return self._s[623]! } public func Time_PreciseDate_m7(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[620]!, self._r[620]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[625]!, self._r[625]!, [_1, _2, _3]) } - public var PasscodeSettings_EncryptDataHelp: String { return self._s[621]! } - public var Passport_Language_ja: String { return self._s[623]! } - public var KeyCommand_FocusOnInputField: String { return self._s[624]! } - public var Channel_Members_AddAdminErrorBlacklisted: String { return self._s[625]! } - public var Cache_KeepMedia: String { return self._s[626]! } - public var SocksProxySetup_ProxyTelegram: String { return self._s[628]! } - public var WebPreview_GettingLinkInfo: String { return self._s[629]! } - public var Group_Setup_TypePublicHelp: String { return self._s[630]! } - public var Map_Satellite: String { return self._s[631]! } - public var Username_InvalidTaken: String { return self._s[632]! } + public var PasscodeSettings_EncryptDataHelp: String { return self._s[626]! } + public var Passport_Language_ja: String { return self._s[628]! } + public var KeyCommand_FocusOnInputField: String { return self._s[629]! } + public var Channel_Members_AddAdminErrorBlacklisted: String { return self._s[630]! } + public var Cache_KeepMedia: String { return self._s[631]! } + public var SocksProxySetup_ProxyTelegram: String { return self._s[633]! } + public var WebPreview_GettingLinkInfo: String { return self._s[634]! } + public var Group_Setup_TypePublicHelp: String { return self._s[635]! } + public var Map_Satellite: String { return self._s[636]! } + public var Username_InvalidTaken: String { return self._s[637]! } public func Notification_PinnedAudioMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[633]!, self._r[633]!, [_0]) + return formatWithArgumentRanges(self._s[638]!, self._r[638]!, [_0]) } - public var Notification_MessageLifetime1d: String { return self._s[634]! } - public var Profile_MessageLifetime2s: String { return self._s[635]! } + public var Notification_MessageLifetime1d: String { return self._s[639]! } + public var Profile_MessageLifetime2s: String { return self._s[640]! } public func TwoStepAuth_RecoveryEmailUnavailable(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[636]!, self._r[636]!, [_0]) + return formatWithArgumentRanges(self._s[641]!, self._r[641]!, [_0]) } - public var Calls_RatingFeedback: String { return self._s[637]! } - public var Profile_EncryptionKey: String { return self._s[638]! } - public var Watch_Suggestion_WhatsUp: String { return self._s[639]! } - public var LoginPassword_PasswordPlaceholder: String { return self._s[640]! } - public var TwoStepAuth_EnterPasswordPassword: String { return self._s[641]! } + public var Calls_RatingFeedback: String { return self._s[642]! } + public var Profile_EncryptionKey: String { return self._s[643]! } + public var Watch_Suggestion_WhatsUp: String { return self._s[644]! } + public var LoginPassword_PasswordPlaceholder: String { return self._s[645]! } + public var TwoStepAuth_EnterPasswordPassword: String { return self._s[646]! } public func Time_PreciseDate_m10(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[643]!, self._r[643]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[648]!, self._r[648]!, [_1, _2, _3]) } public func CHANNEL_MESSAGE_CONTACT(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[644]!, self._r[644]!, [_1]) + return formatWithArgumentRanges(self._s[649]!, self._r[649]!, [_1]) } - public var Passport_Language_bg: String { return self._s[645]! } - public var PrivacySettings_DeleteAccountHelp: String { return self._s[647]! } - public var Notifications_MessageNotificationsExceptionsHelp: String { return self._s[650]! } - public var Channel_Info_Banned: String { return self._s[651]! } - public var Conversation_ShareBotContactConfirmationTitle: String { return self._s[652]! } - public var ConversationProfile_UsersTooMuchError: String { return self._s[653]! } - public var ChatAdmins_AllMembersAreAdminsOffHelp: String { return self._s[654]! } - public var Privacy_GroupsAndChannels_WhoCanAddMe: String { return self._s[655]! } - public var Login_CodeExpiredError: String { return self._s[657]! } - public var Settings_PhoneNumber: String { return self._s[658]! } - public var FastTwoStepSetup_EmailPlaceholder: String { return self._s[659]! } + public var Passport_Language_bg: String { return self._s[650]! } + public var PrivacySettings_DeleteAccountHelp: String { return self._s[652]! } + public var Notifications_MessageNotificationsExceptionsHelp: String { return self._s[655]! } + public var Channel_Info_Banned: String { return self._s[656]! } + public var Conversation_ShareBotContactConfirmationTitle: String { return self._s[657]! } + public var ConversationProfile_UsersTooMuchError: String { return self._s[658]! } + public var ChatAdmins_AllMembersAreAdminsOffHelp: String { return self._s[659]! } + public var Privacy_GroupsAndChannels_WhoCanAddMe: String { return self._s[660]! } + public var Login_CodeExpiredError: String { return self._s[662]! } + public var Settings_PhoneNumber: String { return self._s[663]! } + public var FastTwoStepSetup_EmailPlaceholder: String { return self._s[664]! } public func DialogList_MultipleTypingSuffix(_ _0: Int) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[660]!, self._r[660]!, ["\(_0)"]) + return formatWithArgumentRanges(self._s[665]!, self._r[665]!, ["\(_0)"]) } - public var Passport_Phone_Help: String { return self._s[661]! } - public var Passport_Language_sl: String { return self._s[662]! } - public var Bot_GenericBotStatus: String { return self._s[664]! } - public var PrivacySettings_PasscodeAndTouchId: String { return self._s[665]! } - public var Common_edit: String { return self._s[667]! } - public var Settings_AppLanguage: String { return self._s[669]! } - public var PrivacyLastSeenSettings_WhoCanSeeMyTimestamp: String { return self._s[670]! } + public var Passport_Phone_Help: String { return self._s[666]! } + public var Passport_Language_sl: String { return self._s[667]! } + public var Bot_GenericBotStatus: String { return self._s[669]! } + public var PrivacySettings_PasscodeAndTouchId: String { return self._s[670]! } + public var Common_edit: String { return self._s[672]! } + public var Settings_AppLanguage: String { return self._s[674]! } + public var PrivacyLastSeenSettings_WhoCanSeeMyTimestamp: String { return self._s[675]! } public func Notification_Kicked(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[673]!, self._r[673]!, [_0, _1]) + return formatWithArgumentRanges(self._s[678]!, self._r[678]!, [_0, _1]) } - public var Channel_AdminLog_MessageRestrictedForever: String { return self._s[675]! } - public var Passport_DeleteDocument: String { return self._s[676]! } - public var Notifications_ExceptionsResetToDefaults: String { return self._s[678]! } - public var ChannelInfo_DeleteChannelConfirmation: String { return self._s[679]! } - public var Passport_Address_OneOfTypeBankStatement: String { return self._s[681]! } - public var Weekday_ShortSaturday: String { return self._s[682]! } - public var Settings_Passport: String { return self._s[683]! } - public var Share_AuthTitle: String { return self._s[684]! } - public var Map_SendThisLocation: String { return self._s[685]! } + public var Channel_AdminLog_MessageRestrictedForever: String { return self._s[680]! } + public var Passport_DeleteDocument: String { return self._s[681]! } + public var Notifications_ExceptionsResetToDefaults: String { return self._s[683]! } + public var ChannelInfo_DeleteChannelConfirmation: String { return self._s[684]! } + public var Permissions_CellularDataTitle: String { return self._s[685]! } + public var Passport_Address_OneOfTypeBankStatement: String { return self._s[687]! } + public var Weekday_ShortSaturday: String { return self._s[688]! } + public var Settings_Passport: String { return self._s[689]! } + public var Share_AuthTitle: String { return self._s[690]! } + public var Map_SendThisLocation: String { return self._s[691]! } public func Notification_PinnedDocumentMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[686]!, self._r[686]!, [_0]) + return formatWithArgumentRanges(self._s[692]!, self._r[692]!, [_0]) } - public var Passport_Identity_Surname: String { return self._s[687]! } - public var Conversation_ContextMenuReply: String { return self._s[688]! } - public var Channel_BanUser_PermissionSendMedia: String { return self._s[689]! } - public var NetworkUsageSettings_Wifi: String { return self._s[691]! } - public var Call_Accept: String { return self._s[692]! } - public var Notification_Exceptions_NewException: String { return self._s[694]! } - public var GroupInfo_SetGroupPhotoDelete: String { return self._s[695]! } - public var Login_PhoneBannedError: String { return self._s[697]! } - public var PhotoEditor_CropAuto: String { return self._s[699]! } - public var PhotoEditor_ContrastTool: String { return self._s[700]! } - public var CheckoutInfo_ReceiverInfoNamePlaceholder: String { return self._s[701]! } - public var Passport_InfoLearnMore: String { return self._s[702]! } - public var Channel_AdminLog_MessagePreviousCaption: String { return self._s[703]! } - public var Passport_Identity_DocumentDetails: String { return self._s[704]! } - public var Privacy_PaymentsClear_ShippingInfo: String { return self._s[706]! } + public var Passport_Identity_Surname: String { return self._s[693]! } + public var Conversation_ContextMenuReply: String { return self._s[694]! } + public var Channel_BanUser_PermissionSendMedia: String { return self._s[695]! } + public var NetworkUsageSettings_Wifi: String { return self._s[697]! } + public var Call_Accept: String { return self._s[698]! } + public var Notification_Exceptions_NewException: String { return self._s[700]! } + public var GroupInfo_SetGroupPhotoDelete: String { return self._s[701]! } + public var Login_PhoneBannedError: String { return self._s[703]! } + public var PhotoEditor_CropAuto: String { return self._s[705]! } + public var PhotoEditor_ContrastTool: String { return self._s[706]! } + public var CheckoutInfo_ReceiverInfoNamePlaceholder: String { return self._s[707]! } + public var Passport_InfoLearnMore: String { return self._s[708]! } + public var Channel_AdminLog_MessagePreviousCaption: String { return self._s[709]! } + public var Passport_Identity_DocumentDetails: String { return self._s[710]! } + public var Privacy_PaymentsClear_ShippingInfo: String { return self._s[712]! } public func Passport_Email_UseTelegramEmail(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[707]!, self._r[707]!, [_0]) + return formatWithArgumentRanges(self._s[713]!, self._r[713]!, [_0]) } - public var Passport_Email_UseTelegramEmailHelp: String { return self._s[708]! } - public var UserInfo_NotificationsDefaultDisabled: String { return self._s[709]! } - public var Date_DialogDateFormat: String { return self._s[711]! } - public var Passport_Address_EditTemporaryRegistration: String { return self._s[712]! } - public var ReportPeer_ReasonSpam: String { return self._s[713]! } - public var Privacy_Calls_P2P: String { return self._s[714]! } - public var Compose_TokenListPlaceholder: String { return self._s[715]! } + public var Passport_Email_UseTelegramEmailHelp: String { return self._s[714]! } + public var UserInfo_NotificationsDefaultDisabled: String { return self._s[715]! } + public var Date_DialogDateFormat: String { return self._s[717]! } + public var Passport_Address_EditTemporaryRegistration: String { return self._s[718]! } + public var ReportPeer_ReasonSpam: String { return self._s[719]! } + public var Privacy_Calls_P2P: String { return self._s[720]! } + public var Compose_TokenListPlaceholder: String { return self._s[721]! } public func PINNED_VIDEO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[716]!, self._r[716]!, [_1]) + return formatWithArgumentRanges(self._s[722]!, self._r[722]!, [_1]) } - public var StickerPacksSettings_Title: String { return self._s[718]! } - public var Privacy_PaymentsClearInfoDoneHelp: String { return self._s[719]! } - public var Privacy_Calls_NeverAllow_Placeholder: String { return self._s[720]! } - public var Passport_PassportInformation: String { return self._s[721]! } - public var Passport_Identity_OneOfTypeDriversLicense: String { return self._s[722]! } - public var Settings_Support: String { return self._s[723]! } - public var Notification_GroupInviterSelf: String { return self._s[725]! } - public var TwoStepAuth_EmailAddSuccess: String { return self._s[726]! } + public var StickerPacksSettings_Title: String { return self._s[724]! } + public var Privacy_PaymentsClearInfoDoneHelp: String { return self._s[725]! } + public var Privacy_Calls_NeverAllow_Placeholder: String { return self._s[726]! } + public var Passport_PassportInformation: String { return self._s[727]! } + public var Passport_Identity_OneOfTypeDriversLicense: String { return self._s[728]! } + public var Settings_Support: String { return self._s[729]! } + public var Notification_GroupInviterSelf: String { return self._s[731]! } + public var TwoStepAuth_EmailAddSuccess: String { return self._s[732]! } public func SecretImage_NotViewedYet(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[727]!, self._r[727]!, [_0]) + return formatWithArgumentRanges(self._s[733]!, self._r[733]!, [_0]) } - public var MaskStickerSettings_Title: String { return self._s[729]! } - public var TwoStepAuth_SetPassword: String { return self._s[732]! } + public var MaskStickerSettings_Title: String { return self._s[735]! } + public var TwoStepAuth_SetPassword: String { return self._s[738]! } public func Passport_AcceptHelp(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[734]!, self._r[734]!, [_1, _2]) + return formatWithArgumentRanges(self._s[740]!, self._r[740]!, [_1, _2]) } - public var SocksProxySetup_SavedProxies: String { return self._s[735]! } - public var GroupInfo_InviteLink_ShareLink: String { return self._s[736]! } - public var Common_Cancel: String { return self._s[737]! } - public var UserInfo_About_Placeholder: String { return self._s[739]! } - public var Passport_Identity_NativeNameGenericTitle: String { return self._s[743]! } - public var ApplyLanguage_ApplySuccess: String { return self._s[744]! } - public var Notifications_ChannelNotificationsPreview: String { return self._s[745]! } - public var Camera_Discard: String { return self._s[746]! } - public var TextFormat_Italic: String { return self._s[747]! } - public var ChangePhoneNumberCode_RequestingACall: String { return self._s[748]! } - public var PrivacyLastSeenSettings_NeverShareWith_Title: String { return self._s[749]! } - public var KeyCommand_JumpToNextChat: String { return self._s[751]! } + public var SocksProxySetup_SavedProxies: String { return self._s[741]! } + public var GroupInfo_InviteLink_ShareLink: String { return self._s[742]! } + public var Common_Cancel: String { return self._s[743]! } + public var UserInfo_About_Placeholder: String { return self._s[745]! } + public var Passport_Identity_NativeNameGenericTitle: String { return self._s[749]! } + public var ApplyLanguage_ApplySuccess: String { return self._s[750]! } + public var Permissions_SiriAllow: String { return self._s[751]! } + public var Notifications_ChannelNotificationsPreview: String { return self._s[752]! } + public var Camera_Discard: String { return self._s[753]! } + public var TextFormat_Italic: String { return self._s[754]! } + public var ChangePhoneNumberCode_RequestingACall: String { return self._s[755]! } + public var PrivacyLastSeenSettings_NeverShareWith_Title: String { return self._s[756]! } + public var KeyCommand_JumpToNextChat: String { return self._s[758]! } public func Time_MonthOfYear_m8(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[755]!, self._r[755]!, [_0]) + return formatWithArgumentRanges(self._s[762]!, self._r[762]!, [_0]) } - public var Tour_Text1: String { return self._s[756]! } - public var Privacy_SecretChatsTitle: String { return self._s[757]! } - public var Conversation_HoldForVideo: String { return self._s[758]! } - public var Passport_Language_pt: String { return self._s[759]! } - public var Checkout_NewCard_Title: String { return self._s[760]! } - public var Channel_TitleInfo: String { return self._s[761]! } - public var State_ConnectingToProxy: String { return self._s[762]! } - public var Settings_About_Help: String { return self._s[763]! } - public var AutoNightTheme_ScheduledFrom: String { return self._s[765]! } - public var Passport_Language_tk: String { return self._s[766]! } - public var Watch_Conversation_Reply: String { return self._s[767]! } - public var ShareMenu_CopyShareLink: String { return self._s[768]! } - public var Stickers_Search: String { return self._s[769]! } - public var Notifications_GroupNotificationsExceptions: String { return self._s[770]! } - public var Channel_Setup_TypePrivateHelp: String { return self._s[771]! } - public var PhotoEditor_GrainTool: String { return self._s[772]! } - public var Conversation_SearchByName_Placeholder: String { return self._s[773]! } - public var Watch_Suggestion_TalkLater: String { return self._s[774]! } - public var TwoStepAuth_ChangeEmail: String { return self._s[775]! } - public var Passport_Identity_EditPersonalDetails: String { return self._s[776]! } - public var Passport_FieldPhone: String { return self._s[778]! } + public var Tour_Text1: String { return self._s[763]! } + public var Privacy_SecretChatsTitle: String { return self._s[764]! } + public var Conversation_HoldForVideo: String { return self._s[765]! } + public var Passport_Language_pt: String { return self._s[766]! } + public var Checkout_NewCard_Title: String { return self._s[767]! } + public var Channel_TitleInfo: String { return self._s[768]! } + public var State_ConnectingToProxy: String { return self._s[769]! } + public var Settings_About_Help: String { return self._s[770]! } + public var AutoNightTheme_ScheduledFrom: String { return self._s[772]! } + public var Passport_Language_tk: String { return self._s[773]! } + public var Watch_Conversation_Reply: String { return self._s[774]! } + public var ShareMenu_CopyShareLink: String { return self._s[775]! } + public var Stickers_Search: String { return self._s[776]! } + public var Notifications_GroupNotificationsExceptions: String { return self._s[777]! } + public var Channel_Setup_TypePrivateHelp: String { return self._s[778]! } + public var PhotoEditor_GrainTool: String { return self._s[779]! } + public var Conversation_SearchByName_Placeholder: String { return self._s[780]! } + public var Permissions_NotificationsTitle: String { return self._s[781]! } + public var Watch_Suggestion_TalkLater: String { return self._s[782]! } + public var TwoStepAuth_ChangeEmail: String { return self._s[783]! } + public var Passport_Identity_EditPersonalDetails: String { return self._s[784]! } + public var Passport_FieldPhone: String { return self._s[786]! } public func ENCRYPTION_ACCEPT(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[779]!, self._r[779]!, [_1]) + return formatWithArgumentRanges(self._s[787]!, self._r[787]!, [_1]) } - public var NetworkUsageSettings_BytesSent: String { return self._s[780]! } - public var Conversation_ShareBotLocationConfirmationTitle: String { return self._s[781]! } - public var Conversation_ForwardContacts: String { return self._s[783]! } + public var NetworkUsageSettings_BytesSent: String { return self._s[788]! } + public var Conversation_ShareBotLocationConfirmationTitle: String { return self._s[789]! } + public var Conversation_ForwardContacts: String { return self._s[791]! } public func Notification_ChangedGroupName(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[784]!, self._r[784]!, [_0, _1]) + return formatWithArgumentRanges(self._s[792]!, self._r[792]!, [_0, _1]) } public func MESSAGE_VIDEO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[785]!, self._r[785]!, [_1]) + return formatWithArgumentRanges(self._s[793]!, self._r[793]!, [_1]) } public func Checkout_PayPrice(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[786]!, self._r[786]!, [_0]) + return formatWithArgumentRanges(self._s[794]!, self._r[794]!, [_0]) } public func Notification_PinnedTextMessage(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[787]!, self._r[787]!, [_0, _1]) + return formatWithArgumentRanges(self._s[795]!, self._r[795]!, [_0, _1]) } - public var GroupInfo_InvitationLinkDoesNotExist: String { return self._s[789]! } - public var ReportPeer_ReasonOther_Placeholder: String { return self._s[790]! } - public var Wallpaper_Title: String { return self._s[792]! } - public var PasscodeSettings_AutoLock_Disabled: String { return self._s[793]! } - public var Watch_Compose_CreateMessage: String { return self._s[794]! } - public var ChatSettings_ConnectionType_UseProxy: String { return self._s[795]! } - public var Message_Audio: String { return self._s[797]! } - public var Conversation_SearchNoResults: String { return self._s[799]! } - public var PrivacyPolicy_Accept: String { return self._s[800]! } - public var ReportPeer_ReasonViolence: String { return self._s[801]! } - public var Group_Username_RemoveExistingUsernamesInfo: String { return self._s[802]! } - public var Message_InvoiceLabel: String { return self._s[803]! } - public var Channel_AdminLogFilter_Title: String { return self._s[804]! } - public var Contacts_SearchLabel: String { return self._s[805]! } - public var Group_Username_InvalidStartsWithNumber: String { return self._s[806]! } - public var ChatAdmins_AllMembersAreAdminsOnHelp: String { return self._s[808]! } - public var Month_ShortSeptember: String { return self._s[810]! } - public var Group_Username_CreatePublicLinkHelp: String { return self._s[811]! } - public var Login_CallRequestState2: String { return self._s[812]! } - public var TwoStepAuth_RecoveryUnavailable: String { return self._s[814]! } - public var Bot_Unblock: String { return self._s[815]! } - public var SharedMedia_CategoryMedia: String { return self._s[816]! } - public var Conversation_HoldForAudio: String { return self._s[817]! } - public var Conversation_ClousStorageInfo_Description1: String { return self._s[819]! } - public var Channel_Members_InviteLink: String { return self._s[820]! } - public var Core_ServiceUserStatus: String { return self._s[821]! } - public var WebSearch_RecentClearConfirmation: String { return self._s[822]! } - public var Notification_ChannelMigratedFrom: String { return self._s[823]! } - public var Settings_Title: String { return self._s[825]! } - public var Call_StatusBusy: String { return self._s[826]! } - public var ArchivedPacksAlert_Title: String { return self._s[827]! } - public var ConversationMedia_Title: String { return self._s[828]! } + public var GroupInfo_InvitationLinkDoesNotExist: String { return self._s[797]! } + public var ReportPeer_ReasonOther_Placeholder: String { return self._s[798]! } + public var Wallpaper_Title: String { return self._s[800]! } + public var PasscodeSettings_AutoLock_Disabled: String { return self._s[801]! } + public var Watch_Compose_CreateMessage: String { return self._s[802]! } + public var ChatSettings_ConnectionType_UseProxy: String { return self._s[803]! } + public var Message_Audio: String { return self._s[805]! } + public var Conversation_SearchNoResults: String { return self._s[807]! } + public var PrivacyPolicy_Accept: String { return self._s[808]! } + public var ReportPeer_ReasonViolence: String { return self._s[809]! } + public var Group_Username_RemoveExistingUsernamesInfo: String { return self._s[810]! } + public var Message_InvoiceLabel: String { return self._s[811]! } + public var Channel_AdminLogFilter_Title: String { return self._s[812]! } + public var Contacts_SearchLabel: String { return self._s[813]! } + public var Group_Username_InvalidStartsWithNumber: String { return self._s[814]! } + public var ChatAdmins_AllMembersAreAdminsOnHelp: String { return self._s[816]! } + public var Month_ShortSeptember: String { return self._s[818]! } + public var Group_Username_CreatePublicLinkHelp: String { return self._s[819]! } + public var Login_CallRequestState2: String { return self._s[820]! } + public var TwoStepAuth_RecoveryUnavailable: String { return self._s[822]! } + public var Bot_Unblock: String { return self._s[823]! } + public var SharedMedia_CategoryMedia: String { return self._s[824]! } + public var Conversation_HoldForAudio: String { return self._s[825]! } + public var Conversation_ClousStorageInfo_Description1: String { return self._s[827]! } + public var Channel_Members_InviteLink: String { return self._s[828]! } + public var Core_ServiceUserStatus: String { return self._s[829]! } + public var WebSearch_RecentClearConfirmation: String { return self._s[830]! } + public var Notification_ChannelMigratedFrom: String { return self._s[831]! } + public var Settings_Title: String { return self._s[833]! } + public var Call_StatusBusy: String { return self._s[834]! } + public var ArchivedPacksAlert_Title: String { return self._s[835]! } + public var ConversationMedia_Title: String { return self._s[836]! } public func Conversation_MessageViaUser(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[829]!, self._r[829]!, [_0]) + return formatWithArgumentRanges(self._s[837]!, self._r[837]!, [_0]) } - public var Notification_PassportValueAddress: String { return self._s[830]! } - public var Tour_Title4: String { return self._s[832]! } - public var Call_StatusEnded: String { return self._s[833]! } - public var Notifications_ChannelNotificationsAlert: String { return self._s[834]! } - public var LiveLocationUpdated_JustNow: String { return self._s[835]! } + public var Notification_PassportValueAddress: String { return self._s[838]! } + public var Tour_Title4: String { return self._s[840]! } + public var Call_StatusEnded: String { return self._s[841]! } + public var Notifications_ChannelNotificationsAlert: String { return self._s[842]! } + public var LiveLocationUpdated_JustNow: String { return self._s[843]! } public func Login_BannedPhoneSubject(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[836]!, self._r[836]!, [_0]) + return formatWithArgumentRanges(self._s[844]!, self._r[844]!, [_0]) } - public var Passport_Address_EditResidentialAddress: String { return self._s[838]! } + public var Passport_Address_EditResidentialAddress: String { return self._s[846]! } public func Channel_Management_RestrictedBy(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[839]!, self._r[839]!, [_0]) - } - public var Conversation_UnpinMessageAlert: String { return self._s[840]! } - public var NotificationsSound_Glass: String { return self._s[841]! } - public var Passport_Address_Street1Placeholder: String { return self._s[843]! } - public func Conversation_MessageDialogRetryAll(_ _1: Int) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[844]!, self._r[844]!, ["\(_1)"]) - } - public func Checkout_PasswordEntry_Text(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[847]!, self._r[847]!, [_0]) } - public var Call_Message: String { return self._s[848]! } - public var Contacts_MemberSearchSectionTitleGroup: String { return self._s[849]! } + public var Conversation_UnpinMessageAlert: String { return self._s[848]! } + public var NotificationsSound_Glass: String { return self._s[849]! } + public var Passport_Address_Street1Placeholder: String { return self._s[851]! } + public func Conversation_MessageDialogRetryAll(_ _1: Int) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[852]!, self._r[852]!, ["\(_1)"]) + } + public func Checkout_PasswordEntry_Text(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[855]!, self._r[855]!, [_0]) + } + public var Call_Message: String { return self._s[856]! } + public var Contacts_MemberSearchSectionTitleGroup: String { return self._s[857]! } public func Conversation_BotInteractiveUrlAlert(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[850]!, self._r[850]!, [_0]) + return formatWithArgumentRanges(self._s[858]!, self._r[858]!, [_0]) } - public var TwoStepAuth_SetupResendEmailCodeAlert: String { return self._s[851]! } - public var GroupInfo_SharedMedia: String { return self._s[852]! } + public var TwoStepAuth_SetupResendEmailCodeAlert: String { return self._s[859]! } + public var GroupInfo_SharedMedia: String { return self._s[860]! } public func Time_PreciseDate_m6(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[853]!, self._r[853]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[861]!, self._r[861]!, [_1, _2, _3]) } - public var Channel_Username_InvalidStartsWithNumber: String { return self._s[854]! } - public var KeyCommand_JumpToPreviousChat: String { return self._s[855]! } - public var Conversation_Call: String { return self._s[856]! } - public var KeyCommand_ScrollUp: String { return self._s[857]! } + public var Channel_Username_InvalidStartsWithNumber: String { return self._s[862]! } + public var KeyCommand_JumpToPreviousChat: String { return self._s[863]! } + public var Conversation_Call: String { return self._s[864]! } + public var KeyCommand_ScrollUp: String { return self._s[865]! } public func Privacy_GroupsAndChannels_InviteToChannelError(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[858]!, self._r[858]!, [_0, _1]) + return formatWithArgumentRanges(self._s[866]!, self._r[866]!, [_0, _1]) } - public var AuthSessions_Sessions: String { return self._s[861]! } - public var Document_TargetConfirmationFormat: String { return self._s[862]! } - public var Group_Setup_TypeHeader: String { return self._s[863]! } + public var AuthSessions_Sessions: String { return self._s[869]! } + public var Document_TargetConfirmationFormat: String { return self._s[870]! } + public var Group_Setup_TypeHeader: String { return self._s[871]! } public func DialogList_SinglePlayingGameSuffix(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[864]!, self._r[864]!, [_0]) + return formatWithArgumentRanges(self._s[872]!, self._r[872]!, [_0]) } - public var AttachmentMenu_SendAsFiles: String { return self._s[865]! } - public var Profile_MessageLifetime1m: String { return self._s[867]! } - public var Passport_PasswordReset: String { return self._s[869]! } - public var Settings_AppleWatch: String { return self._s[870]! } - public var Passport_PasswordCompleteSetup: String { return self._s[872]! } - public var Notifications_ExceptionsTitle: String { return self._s[873]! } - public var Passport_Language_de: String { return self._s[874]! } - public var Channel_AdminLog_MessagePreviousDescription: String { return self._s[875]! } - public var Your_card_was_declined: String { return self._s[876]! } - public var Notifications_DisplayNamesOnLockScreen: String { return self._s[877]! } - public var PhoneNumberHelp_ChangeNumber: String { return self._s[879]! } - public var ReportPeer_ReasonPornography: String { return self._s[880]! } - public var Notification_CreatedChannel: String { return self._s[881]! } - public var PhotoEditor_Original: String { return self._s[882]! } - public var NotificationsSound_Chord: String { return self._s[883]! } - public var Target_SelectGroup: String { return self._s[884]! } - public var Stickers_SuggestAdded: String { return self._s[886]! } - public var Channel_AdminLog_InfoPanelAlertTitle: String { return self._s[887]! } - public var Notifications_GroupNotificationsPreview: String { return self._s[889]! } - public var ChatSettings_AutoDownloadPhotos: String { return self._s[890]! } - public var Message_PinnedLocationMessage: String { return self._s[892]! } - public var Appearance_PreviewReplyText: String { return self._s[893]! } - public var Passport_Address_Street2Placeholder: String { return self._s[894]! } - public var Settings_Logout: String { return self._s[895]! } + public var AttachmentMenu_SendAsFiles: String { return self._s[873]! } + public var Profile_MessageLifetime1m: String { return self._s[875]! } + public var Passport_PasswordReset: String { return self._s[877]! } + public var Settings_AppleWatch: String { return self._s[878]! } + public var Passport_PasswordCompleteSetup: String { return self._s[880]! } + public var Notifications_ExceptionsTitle: String { return self._s[881]! } + public var Permissions_NotificationsAllow: String { return self._s[882]! } + public var Passport_Language_de: String { return self._s[883]! } + public var Channel_AdminLog_MessagePreviousDescription: String { return self._s[884]! } + public var Your_card_was_declined: String { return self._s[885]! } + public var Notifications_DisplayNamesOnLockScreen: String { return self._s[886]! } + public var PhoneNumberHelp_ChangeNumber: String { return self._s[888]! } + public var ReportPeer_ReasonPornography: String { return self._s[889]! } + public var Notification_CreatedChannel: String { return self._s[890]! } + public var PhotoEditor_Original: String { return self._s[891]! } + public var NotificationsSound_Chord: String { return self._s[892]! } + public var Target_SelectGroup: String { return self._s[893]! } + public var Stickers_SuggestAdded: String { return self._s[895]! } + public var Channel_AdminLog_InfoPanelAlertTitle: String { return self._s[896]! } + public var Notifications_GroupNotificationsPreview: String { return self._s[898]! } + public var ChatSettings_AutoDownloadPhotos: String { return self._s[899]! } + public var Message_PinnedLocationMessage: String { return self._s[901]! } + public var Appearance_PreviewReplyText: String { return self._s[902]! } + public var Passport_Address_Street2Placeholder: String { return self._s[903]! } + public var Settings_Logout: String { return self._s[904]! } public func UserInfo_BlockConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[896]!, self._r[896]!, [_0]) + return formatWithArgumentRanges(self._s[905]!, self._r[905]!, [_0]) } - public var Profile_Username: String { return self._s[898]! } - public var Group_Username_InvalidTooShort: String { return self._s[899]! } - public var Appearance_AutoNightTheme: String { return self._s[900]! } - public var AuthSessions_TerminateOtherSessions: String { return self._s[903]! } - public var PasscodeSettings_TryAgainIn1Minute: String { return self._s[904]! } - public var Privacy_TopPeers: String { return self._s[905]! } - public var Passport_Phone_EnterOtherNumber: String { return self._s[906]! } - public var NotificationsSound_Hello: String { return self._s[907]! } - public var Notifications_InAppNotifications: String { return self._s[908]! } + public var Profile_Username: String { return self._s[907]! } + public var Group_Username_InvalidTooShort: String { return self._s[908]! } + public var Appearance_AutoNightTheme: String { return self._s[909]! } + public var AuthSessions_TerminateOtherSessions: String { return self._s[912]! } + public var PasscodeSettings_TryAgainIn1Minute: String { return self._s[913]! } + public var Privacy_TopPeers: String { return self._s[914]! } + public var Passport_Phone_EnterOtherNumber: String { return self._s[915]! } + public var NotificationsSound_Hello: String { return self._s[916]! } + public var Notifications_InAppNotifications: String { return self._s[917]! } public func Notification_PassportValuesSentMessage(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[909]!, self._r[909]!, [_1, _2]) + return formatWithArgumentRanges(self._s[918]!, self._r[918]!, [_1, _2]) } - public var Passport_Language_is: String { return self._s[911]! } - public var StickerPack_ViewPack: String { return self._s[912]! } - public var EnterPasscode_ChangeTitle: String { return self._s[913]! } - public var Call_Decline: String { return self._s[914]! } - public var UserInfo_AddPhone: String { return self._s[916]! } - public var AutoNightTheme_Title: String { return self._s[917]! } - public var Activity_PlayingGame: String { return self._s[919]! } - public var CheckoutInfo_ShippingInfoStatePlaceholder: String { return self._s[920]! } - public var SaveIncomingPhotosSettings_From: String { return self._s[922]! } - public var Passport_Address_TypeBankStatementUploadScan: String { return self._s[924]! } - public var Notifications_MessageNotificationsSound: String { return self._s[925]! } - public var Call_StatusWaiting: String { return self._s[926]! } - public var Passport_Identity_MainPageHelp: String { return self._s[927]! } - public var Weekday_ShortWednesday: String { return self._s[928]! } - public var Notifications_Title: String { return self._s[929]! } - public var PasscodeSettings_AutoLock_IfAwayFor_5hours: String { return self._s[930]! } - public var Conversation_PinnedMessage: String { return self._s[932]! } - public var Notifications_ChannelNotificationsHelp: String { return self._s[933]! } + public var Passport_Language_is: String { return self._s[920]! } + public var StickerPack_ViewPack: String { return self._s[921]! } + public var EnterPasscode_ChangeTitle: String { return self._s[922]! } + public var Call_Decline: String { return self._s[923]! } + public var UserInfo_AddPhone: String { return self._s[925]! } + public var AutoNightTheme_Title: String { return self._s[926]! } + public var Activity_PlayingGame: String { return self._s[928]! } + public var CheckoutInfo_ShippingInfoStatePlaceholder: String { return self._s[929]! } + public var SaveIncomingPhotosSettings_From: String { return self._s[931]! } + public var Passport_Address_TypeBankStatementUploadScan: String { return self._s[933]! } + public var Notifications_MessageNotificationsSound: String { return self._s[934]! } + public var Call_StatusWaiting: String { return self._s[935]! } + public var Passport_Identity_MainPageHelp: String { return self._s[936]! } + public var Weekday_ShortWednesday: String { return self._s[937]! } + public var Notifications_Title: String { return self._s[938]! } + public var PasscodeSettings_AutoLock_IfAwayFor_5hours: String { return self._s[939]! } + public var Conversation_PinnedMessage: String { return self._s[941]! } + public var Notifications_ChannelNotificationsHelp: String { return self._s[942]! } public func Time_MonthOfYear_m12(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[935]!, self._r[935]!, [_0]) + return formatWithArgumentRanges(self._s[944]!, self._r[944]!, [_0]) } - public var ConversationProfile_LeaveDeleteAndExit: String { return self._s[936]! } - public var State_connecting: String { return self._s[937]! } - public var Channel_AdminLog_MessagePreviousMessage: String { return self._s[938]! } - public var Passport_Scans_Upload: String { return self._s[940]! } - public var AutoDownloadSettings_PhotosTitle: String { return self._s[941]! } - public var Map_OpenInHereMaps: String { return self._s[942]! } - public var Stickers_FavoriteStickers: String { return self._s[944]! } - public var CheckoutInfo_Pay: String { return self._s[945]! } - public var Passport_Identity_FrontSideHelp: String { return self._s[946]! } - public var Update_UpdateApp: String { return self._s[947]! } - public var Login_CountryCode: String { return self._s[948]! } - public var PasscodeSettings_AutoLock_IfAwayFor_1hour: String { return self._s[949]! } - public var CheckoutInfo_ShippingInfoState: String { return self._s[950]! } + public var ConversationProfile_LeaveDeleteAndExit: String { return self._s[945]! } + public var State_connecting: String { return self._s[946]! } + public var Channel_AdminLog_MessagePreviousMessage: String { return self._s[947]! } + public var Passport_Scans_Upload: String { return self._s[949]! } + public var AutoDownloadSettings_PhotosTitle: String { return self._s[950]! } + public var Map_OpenInHereMaps: String { return self._s[951]! } + public var Stickers_FavoriteStickers: String { return self._s[953]! } + public var CheckoutInfo_Pay: String { return self._s[954]! } + public var Passport_Identity_FrontSideHelp: String { return self._s[955]! } + public var Update_UpdateApp: String { return self._s[956]! } + public var Login_CountryCode: String { return self._s[957]! } + public var PasscodeSettings_AutoLock_IfAwayFor_1hour: String { return self._s[958]! } + public var CheckoutInfo_ShippingInfoState: String { return self._s[959]! } public func CHAT_MESSAGE_AUDIO(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[951]!, self._r[951]!, [_1, _2]) + return formatWithArgumentRanges(self._s[960]!, self._r[960]!, [_1, _2]) } - public var Login_SmsRequestState2: String { return self._s[952]! } - public var Preview_SaveToCameraRoll: String { return self._s[953]! } - public var SocksProxySetup_ProxyStatusConnecting: String { return self._s[954]! } - public var Broadcast_AdminLog_EmptyText: String { return self._s[955]! } - public var PasscodeSettings_ChangePasscode: String { return self._s[956]! } - public var TwoStepAuth_RecoveryCodeInvalid: String { return self._s[957]! } + public var Login_SmsRequestState2: String { return self._s[961]! } + public var Preview_SaveToCameraRoll: String { return self._s[962]! } + public var SocksProxySetup_ProxyStatusConnecting: String { return self._s[963]! } + public var Broadcast_AdminLog_EmptyText: String { return self._s[964]! } + public var PasscodeSettings_ChangePasscode: String { return self._s[965]! } + public var TwoStepAuth_RecoveryCodeInvalid: String { return self._s[966]! } public func Message_PaymentSent(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[958]!, self._r[958]!, [_0]) + return formatWithArgumentRanges(self._s[967]!, self._r[967]!, [_0]) } - public var TwoStepAuth_RecoveryEmailChangeDescription: String { return self._s[960]! } - public var Message_PinnedAudioMessage: String { return self._s[961]! } - public var ChatSettings_ConnectionType_Title: String { return self._s[964]! } + public var TwoStepAuth_RecoveryEmailChangeDescription: String { return self._s[969]! } + public var Message_PinnedAudioMessage: String { return self._s[970]! } + public var ChatSettings_ConnectionType_Title: String { return self._s[973]! } public func Conversation_RestrictedMediaTimed(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[966]!, self._r[966]!, [_0]) + return formatWithArgumentRanges(self._s[975]!, self._r[975]!, [_0]) } - public var NotificationsSound_Complete: String { return self._s[967]! } - public var NotificationsSound_Chime: String { return self._s[968]! } - public var Login_InfoDeletePhoto: String { return self._s[969]! } - public var ContactInfo_BirthdayLabel: String { return self._s[972]! } - public var TwoStepAuth_RecoveryCodeExpired: String { return self._s[973]! } - public var AutoDownloadSettings_Channels: String { return self._s[974]! } - public var AutoDownloadSettings_Contacts: String { return self._s[976]! } - public var TwoStepAuth_EmailTitle: String { return self._s[977]! } - public var Passport_Email_EmailPlaceholder: String { return self._s[978]! } - public var Channel_AdminLog_ChannelEmptyText: String { return self._s[979]! } - public var Passport_Address_EditUtilityBill: String { return self._s[980]! } - public var Privacy_GroupsAndChannels_NeverAllow: String { return self._s[981]! } - public var Conversation_RestrictedStickers: String { return self._s[982]! } - public var Conversation_AddContact: String { return self._s[983]! } - public var Login_CancelPhoneVerificationContinue: String { return self._s[984]! } + public var NotificationsSound_Complete: String { return self._s[976]! } + public var NotificationsSound_Chime: String { return self._s[977]! } + public var Login_InfoDeletePhoto: String { return self._s[978]! } + public var ContactInfo_BirthdayLabel: String { return self._s[981]! } + public var TwoStepAuth_RecoveryCodeExpired: String { return self._s[982]! } + public var AutoDownloadSettings_Channels: String { return self._s[983]! } + public var AutoDownloadSettings_Contacts: String { return self._s[985]! } + public var TwoStepAuth_EmailTitle: String { return self._s[986]! } + public var Passport_Email_EmailPlaceholder: String { return self._s[987]! } + public var Channel_AdminLog_ChannelEmptyText: String { return self._s[988]! } + public var Passport_Address_EditUtilityBill: String { return self._s[989]! } + public var Privacy_GroupsAndChannels_NeverAllow: String { return self._s[990]! } + public var Conversation_RestrictedStickers: String { return self._s[991]! } + public var Conversation_AddContact: String { return self._s[992]! } + public var Login_CancelPhoneVerificationContinue: String { return self._s[993]! } public func Time_MonthOfYear_m7(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[985]!, self._r[985]!, [_0]) + return formatWithArgumentRanges(self._s[994]!, self._r[994]!, [_0]) } - public var PhotoEditor_QualityLow: String { return self._s[986]! } - public var Paint_Outlined: String { return self._s[987]! } - public var State_ConnectingToProxyInfo: String { return self._s[989]! } - public var Checkout_PasswordEntry_Title: String { return self._s[990]! } - public var Conversation_InputTextCaptionPlaceholder: String { return self._s[992]! } - public var Common_Done: String { return self._s[993]! } - public var Passport_Identity_FilesUploadNew: String { return self._s[994]! } - public var PrivacySettings_LastSeenContacts: String { return self._s[996]! } - public var Passport_Language_vi: String { return self._s[997]! } - public var CheckoutInfo_ShippingInfoAddress1: String { return self._s[998]! } - public var UserInfo_LastNamePlaceholder: String { return self._s[999]! } - public var Conversation_StatusKickedFromChannel: String { return self._s[1001]! } - public var CheckoutInfo_ShippingInfoAddress2: String { return self._s[1002]! } + public var PhotoEditor_QualityLow: String { return self._s[995]! } + public var Paint_Outlined: String { return self._s[996]! } + public var State_ConnectingToProxyInfo: String { return self._s[998]! } + public var Checkout_PasswordEntry_Title: String { return self._s[999]! } + public var Conversation_InputTextCaptionPlaceholder: String { return self._s[1001]! } + public var Common_Done: String { return self._s[1002]! } + public var Passport_Identity_FilesUploadNew: String { return self._s[1003]! } + public var PrivacySettings_LastSeenContacts: String { return self._s[1005]! } + public var Passport_Language_vi: String { return self._s[1006]! } + public var CheckoutInfo_ShippingInfoAddress1: String { return self._s[1007]! } + public var UserInfo_LastNamePlaceholder: String { return self._s[1008]! } + public var Conversation_StatusKickedFromChannel: String { return self._s[1010]! } + public var CheckoutInfo_ShippingInfoAddress2: String { return self._s[1011]! } public func DialogList_SingleTypingSuffix(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1003]!, self._r[1003]!, [_0]) + return formatWithArgumentRanges(self._s[1012]!, self._r[1012]!, [_0]) } - public var LastSeen_JustNow: String { return self._s[1004]! } - public var GroupInfo_InviteLink_RevokeAlert_Text: String { return self._s[1005]! } - public var BroadcastListInfo_AddRecipient: String { return self._s[1006]! } + public var LastSeen_JustNow: String { return self._s[1013]! } + public var GroupInfo_InviteLink_RevokeAlert_Text: String { return self._s[1014]! } + public var BroadcastListInfo_AddRecipient: String { return self._s[1015]! } public func Channel_Management_ErrorNotMember(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1007]!, self._r[1007]!, [_0]) + return formatWithArgumentRanges(self._s[1016]!, self._r[1016]!, [_0]) } - public var Privacy_Calls_NeverAllow: String { return self._s[1008]! } - public var Settings_About_Title: String { return self._s[1009]! } - public var PhoneNumberHelp_Help: String { return self._s[1010]! } - public var Channel_LinkItem: String { return self._s[1012]! } - public var Camera_Retake: String { return self._s[1013]! } - public var StickerPack_ShowStickers: String { return self._s[1014]! } - public var Conversation_RestrictedText: String { return self._s[1015]! } - public var Channel_Stickers_YourStickers: String { return self._s[1016]! } + public var Privacy_Calls_NeverAllow: String { return self._s[1017]! } + public var Settings_About_Title: String { return self._s[1018]! } + public var PhoneNumberHelp_Help: String { return self._s[1019]! } + public var Channel_LinkItem: String { return self._s[1021]! } + public var Camera_Retake: String { return self._s[1022]! } + public var StickerPack_ShowStickers: String { return self._s[1023]! } + public var Conversation_RestrictedText: String { return self._s[1024]! } + public var Channel_Stickers_YourStickers: String { return self._s[1025]! } public func CHAT_CREATED(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1020]!, self._r[1020]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1029]!, self._r[1029]!, [_1, _2]) } - public var LastSeen_WithinAMonth: String { return self._s[1021]! } + public var LastSeen_WithinAMonth: String { return self._s[1030]! } public func PrivacySettings_LastSeenContactsPlus(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1022]!, self._r[1022]!, [_0]) - } - public var ApplyLanguage_UnsufficientDataTitle: String { return self._s[1023]! } - public var ChangePhoneNumberNumber_NewNumber: String { return self._s[1025]! } - public var Compose_NewChannel: String { return self._s[1026]! } - public var NotificationsSound_Circles: String { return self._s[1027]! } - public var Login_TermsOfServiceAgree: String { return self._s[1029]! } - public var Channel_AdminLog_CanChangeInviteLink: String { return self._s[1030]! } - public func Passport_RequestHeader(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[1031]!, self._r[1031]!, [_0]) } - public func Call_CallInProgressMessage(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1032]!, self._r[1032]!, [_1, _2]) + public var ApplyLanguage_UnsufficientDataTitle: String { return self._s[1032]! } + public var ChangePhoneNumberNumber_NewNumber: String { return self._s[1034]! } + public var Compose_NewChannel: String { return self._s[1035]! } + public var Permissions_NotificationsText: String { return self._s[1036]! } + public var NotificationsSound_Circles: String { return self._s[1037]! } + public var Login_TermsOfServiceAgree: String { return self._s[1039]! } + public var Channel_AdminLog_CanChangeInviteLink: String { return self._s[1040]! } + public func Passport_RequestHeader(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[1041]!, self._r[1041]!, [_0]) } - public var Conversation_InputTextBroadcastPlaceholder: String { return self._s[1034]! } + public func Call_CallInProgressMessage(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[1042]!, self._r[1042]!, [_1, _2]) + } + public var Conversation_InputTextBroadcastPlaceholder: String { return self._s[1044]! } public func ShareFileTip_Text(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1036]!, self._r[1036]!, [_0]) + return formatWithArgumentRanges(self._s[1046]!, self._r[1046]!, [_0]) } public func CancelResetAccount_TextSMS(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1037]!, self._r[1037]!, [_0]) + return formatWithArgumentRanges(self._s[1047]!, self._r[1047]!, [_0]) } - public var Channel_EditAdmin_PermissionInviteUsers: String { return self._s[1038]! } - public var Privacy_Calls_P2PNever: String { return self._s[1039]! } - public var GroupInfo_DeleteAndExit: String { return self._s[1040]! } - public var GroupInfo_InviteLink_CopyLink: String { return self._s[1041]! } - public var Weekday_Friday: String { return self._s[1043]! } - public var Login_ResetAccountProtected_Title: String { return self._s[1044]! } - public var Settings_SetProfilePhoto: String { return self._s[1045]! } - public var Compose_ChannelTokenListPlaceholder: String { return self._s[1046]! } - public var Channel_EditAdmin_PermissionPinMessages: String { return self._s[1047]! } - public var Your_card_has_expired: String { return self._s[1048]! } + public var Channel_EditAdmin_PermissionInviteUsers: String { return self._s[1048]! } + public var Privacy_Calls_P2PNever: String { return self._s[1049]! } + public var GroupInfo_DeleteAndExit: String { return self._s[1050]! } + public var GroupInfo_InviteLink_CopyLink: String { return self._s[1051]! } + public var Weekday_Friday: String { return self._s[1053]! } + public var Login_ResetAccountProtected_Title: String { return self._s[1054]! } + public var Settings_SetProfilePhoto: String { return self._s[1055]! } + public var Compose_ChannelTokenListPlaceholder: String { return self._s[1056]! } + public var Channel_EditAdmin_PermissionPinMessages: String { return self._s[1057]! } + public var Your_card_has_expired: String { return self._s[1058]! } public func CHAT_MESSAGE_INVOICE(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1051]!, self._r[1051]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1061]!, self._r[1061]!, [_1, _2, _3]) } - public var ChannelInfo_ConfirmLeave: String { return self._s[1052]! } - public var ShareMenu_CopyShareLinkGame: String { return self._s[1053]! } - public var ReportPeer_ReasonOther: String { return self._s[1055]! } + public var ChannelInfo_ConfirmLeave: String { return self._s[1062]! } + public var ShareMenu_CopyShareLinkGame: String { return self._s[1063]! } + public var ReportPeer_ReasonOther: String { return self._s[1065]! } public func Username_UsernameIsAvailable(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1056]!, self._r[1056]!, [_0]) - } - public var KeyCommand_JumpToNextUnreadChat: String { return self._s[1058]! } - public var InfoPlist_NSContactsUsageDescription: String { return self._s[1059]! } - public func SocksProxySetup_ProxyStatusPing(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1061]!, self._r[1061]!, [_0]) - } - public func Date_ChatDateHeader(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1062]!, self._r[1062]!, [_1, _2]) - } - public var Conversation_EncryptedDescriptionTitle: String { return self._s[1064]! } - public var DialogList_Pin: String { return self._s[1065]! } - public func Notification_RemovedGroupPhoto(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[1066]!, self._r[1066]!, [_0]) } - public var Channel_ErrorAddTooMuch: String { return self._s[1067]! } - public var GroupInfo_SharedMediaNone: String { return self._s[1068]! } - public var ChatSettings_TextSizeUnits: String { return self._s[1069]! } - public var ChatSettings_AutoPlayAnimations: String { return self._s[1070]! } - public var Conversation_FileOpenIn: String { return self._s[1071]! } - public var Channel_Setup_TypePublic: String { return self._s[1072]! } - public func ChangePhone_ErrorOccupied(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1073]!, self._r[1073]!, [_0]) + public var KeyCommand_JumpToNextUnreadChat: String { return self._s[1068]! } + public var InfoPlist_NSContactsUsageDescription: String { return self._s[1069]! } + public func SocksProxySetup_ProxyStatusPing(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[1071]!, self._r[1071]!, [_0]) } - public var ContactInfo_PhoneLabelMain: String { return self._s[1074]! } - public var Clipboard_SendPhoto: String { return self._s[1075]! } - public var Privacy_GroupsAndChannels_CustomShareHelp: String { return self._s[1076]! } - public var KeyCommand_ChatInfo: String { return self._s[1077]! } - public var Channel_AdminLog_EmptyFilterTitle: String { return self._s[1078]! } - public var PhotoEditor_HighlightsTint: String { return self._s[1079]! } - public var Passport_Address_Region: String { return self._s[1081]! } - public var Watch_Compose_AddContact: String { return self._s[1082]! } + public func Date_ChatDateHeader(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[1072]!, self._r[1072]!, [_1, _2]) + } + public var Conversation_EncryptedDescriptionTitle: String { return self._s[1074]! } + public var DialogList_Pin: String { return self._s[1075]! } + public func Notification_RemovedGroupPhoto(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[1076]!, self._r[1076]!, [_0]) + } + public var Channel_ErrorAddTooMuch: String { return self._s[1077]! } + public var GroupInfo_SharedMediaNone: String { return self._s[1078]! } + public var ChatSettings_TextSizeUnits: String { return self._s[1079]! } + public var ChatSettings_AutoPlayAnimations: String { return self._s[1080]! } + public var Conversation_FileOpenIn: String { return self._s[1081]! } + public var Channel_Setup_TypePublic: String { return self._s[1082]! } + public func ChangePhone_ErrorOccupied(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[1083]!, self._r[1083]!, [_0]) + } + public var ContactInfo_PhoneLabelMain: String { return self._s[1084]! } + public var Clipboard_SendPhoto: String { return self._s[1085]! } + public var Privacy_GroupsAndChannels_CustomShareHelp: String { return self._s[1086]! } + public var KeyCommand_ChatInfo: String { return self._s[1087]! } + public var Channel_AdminLog_EmptyFilterTitle: String { return self._s[1088]! } + public var PhotoEditor_HighlightsTint: String { return self._s[1089]! } + public var Passport_Address_Region: String { return self._s[1091]! } + public var Watch_Compose_AddContact: String { return self._s[1092]! } public func Time_PreciseDate_m5(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1083]!, self._r[1083]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1093]!, self._r[1093]!, [_1, _2, _3]) } public func Channel_AdminLog_MessageKickedNameUsername(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1084]!, self._r[1084]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1094]!, self._r[1094]!, [_1, _2]) } public func Login_WillSendSms(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1085]!, self._r[1085]!, [_0]) + return formatWithArgumentRanges(self._s[1095]!, self._r[1095]!, [_0]) } - public var Coub_TapForSound: String { return self._s[1086]! } + public var Coub_TapForSound: String { return self._s[1096]! } public func AuthCode_Alert(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1088]!, self._r[1088]!, [_0]) + return formatWithArgumentRanges(self._s[1098]!, self._r[1098]!, [_0]) } - public var Compose_NewEncryptedChat: String { return self._s[1090]! } - public var PhotoEditor_CropReset: String { return self._s[1091]! } - public var Privacy_Calls_P2PAlways: String { return self._s[1093]! } - public var Passport_Address_TypeTemporaryRegistrationUploadScan: String { return self._s[1094]! } - public var Login_InvalidLastNameError: String { return self._s[1095]! } - public var Channel_Members_AddMembers: String { return self._s[1096]! } - public var Tour_Title2: String { return self._s[1097]! } - public var Login_TermsOfServiceHeader: String { return self._s[1099]! } - public var Channel_AdminLog_BanSendGifs: String { return self._s[1100]! } - public var Login_TermsOfServiceSignupDecline: String { return self._s[1102]! } - public var InfoPlist_NSMicrophoneUsageDescription: String { return self._s[1103]! } - public var AuthSessions_OtherSessions: String { return self._s[1104]! } - public var Watch_UserInfo_Title: String { return self._s[1105]! } - public var InstantPage_FeedbackButton: String { return self._s[1106]! } + public var Compose_NewEncryptedChat: String { return self._s[1100]! } + public var PhotoEditor_CropReset: String { return self._s[1101]! } + public var Privacy_Calls_P2PAlways: String { return self._s[1103]! } + public var Passport_Address_TypeTemporaryRegistrationUploadScan: String { return self._s[1104]! } + public var Login_InvalidLastNameError: String { return self._s[1105]! } + public var Channel_Members_AddMembers: String { return self._s[1106]! } + public var Tour_Title2: String { return self._s[1107]! } + public var Login_TermsOfServiceHeader: String { return self._s[1109]! } + public var Channel_AdminLog_BanSendGifs: String { return self._s[1110]! } + public var Login_TermsOfServiceSignupDecline: String { return self._s[1112]! } + public var InfoPlist_NSMicrophoneUsageDescription: String { return self._s[1113]! } + public var AuthSessions_OtherSessions: String { return self._s[1114]! } + public var Watch_UserInfo_Title: String { return self._s[1115]! } + public var InstantPage_FeedbackButton: String { return self._s[1116]! } public func Generic_OpenHiddenLinkAlert(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1107]!, self._r[1107]!, [_0]) + return formatWithArgumentRanges(self._s[1117]!, self._r[1117]!, [_0]) } - public var Conversation_Contact: String { return self._s[1108]! } - public var NetworkUsageSettings_GeneralDataSection: String { return self._s[1109]! } - public var EnterPasscode_RepeatNewPasscode: String { return self._s[1112]! } - public var Conversation_ContextMenuCopyLink: String { return self._s[1113]! } - public var Passport_Language_sk: String { return self._s[1114]! } - public var InstantPage_AutoNightTheme: String { return self._s[1115]! } - public var CloudStorage_Title: String { return self._s[1116]! } - public var Month_ShortOctober: String { return self._s[1117]! } - public var Settings_FAQ: String { return self._s[1119]! } - public var PrivacySettings_LastSeen: String { return self._s[1120]! } - public var DialogList_SearchSectionRecent: String { return self._s[1121]! } - public var ChatSettings_AutomaticVideoMessageDownload: String { return self._s[1122]! } - public var Conversation_ContextMenuDelete: String { return self._s[1123]! } - public var Tour_Text6: String { return self._s[1124]! } - public var PhotoEditor_WarmthTool: String { return self._s[1125]! } - public var Passport_Address_TypePassportRegistrationUploadScan: String { return self._s[1127]! } - public var Common_TakePhoto: String { return self._s[1128]! } - public var SocksProxySetup_AdNoticeHelp: String { return self._s[1129]! } - public var UserInfo_CreateNewContact: String { return self._s[1131]! } - public var NetworkUsageSettings_MediaDocumentDataSection: String { return self._s[1132]! } - public var Login_CodeSentCall: String { return self._s[1133]! } - public var Watch_PhotoView_Title: String { return self._s[1134]! } + public var Conversation_Contact: String { return self._s[1118]! } + public var NetworkUsageSettings_GeneralDataSection: String { return self._s[1119]! } + public var EnterPasscode_RepeatNewPasscode: String { return self._s[1122]! } + public var Conversation_ContextMenuCopyLink: String { return self._s[1123]! } + public var Passport_Language_sk: String { return self._s[1124]! } + public var InstantPage_AutoNightTheme: String { return self._s[1125]! } + public var CloudStorage_Title: String { return self._s[1126]! } + public var Month_ShortOctober: String { return self._s[1127]! } + public var Settings_FAQ: String { return self._s[1129]! } + public var PrivacySettings_LastSeen: String { return self._s[1130]! } + public var DialogList_SearchSectionRecent: String { return self._s[1131]! } + public var ChatSettings_AutomaticVideoMessageDownload: String { return self._s[1132]! } + public var Conversation_ContextMenuDelete: String { return self._s[1133]! } + public var Tour_Text6: String { return self._s[1134]! } + public var PhotoEditor_WarmthTool: String { return self._s[1135]! } + public var Passport_Address_TypePassportRegistrationUploadScan: String { return self._s[1137]! } + public var Common_TakePhoto: String { return self._s[1138]! } + public var SocksProxySetup_AdNoticeHelp: String { return self._s[1139]! } + public var Permissions_SiriAllowInSettings: String { return self._s[1140]! } + public var UserInfo_CreateNewContact: String { return self._s[1142]! } + public var NetworkUsageSettings_MediaDocumentDataSection: String { return self._s[1143]! } + public var Login_CodeSentCall: String { return self._s[1144]! } + public var Watch_PhotoView_Title: String { return self._s[1145]! } public func PrivacySettings_LastSeenContactsMinus(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1135]!, self._r[1135]!, [_0]) + return formatWithArgumentRanges(self._s[1146]!, self._r[1146]!, [_0]) } - public var ShareMenu_SelectChats: String { return self._s[1137]! } - public var Group_ErrorSendRestrictedMedia: String { return self._s[1138]! } - public var Group_Setup_HistoryVisible: String { return self._s[1139]! } - public var Channel_EditAdmin_PermissinAddAdminOff: String { return self._s[1140]! } - public var DialogList_ProxyConnectionIssuesTooltip: String { return self._s[1142]! } - public var Cache_Files: String { return self._s[1143]! } - public var PhotoEditor_EnhanceTool: String { return self._s[1145]! } - public var Conversation_SearchPlaceholder: String { return self._s[1146]! } - public var Channel_Stickers_NotFound: String { return self._s[1147]! } - public var UserInfo_NotificationsDefaultEnabled: String { return self._s[1151]! } - public var Login_CodeExpired: String { return self._s[1152]! } - public var WatchRemote_AlertText: String { return self._s[1153]! } - public var Channel_AdminLog_CanInviteUsers: String { return self._s[1155]! } - public var Channel_BanUser_PermissionReadMessages: String { return self._s[1157]! } - public var AttachmentMenu_PhotoOrVideo: String { return self._s[1158]! } - public var Passport_Identity_GenderPlaceholder: String { return self._s[1159]! } - public var Month_ShortMarch: String { return self._s[1160]! } - public var GroupInfo_InviteLink_Title: String { return self._s[1161]! } - public var Watch_LastSeen_JustNow: String { return self._s[1162]! } - public var PhoneLabel_Title: String { return self._s[1163]! } - public var PrivacySettings_Passcode: String { return self._s[1165]! } - public var Paint_ClearConfirm: String { return self._s[1167]! } - public var SocksProxySetup_Secret: String { return self._s[1168]! } + public var ShareMenu_SelectChats: String { return self._s[1148]! } + public var Group_ErrorSendRestrictedMedia: String { return self._s[1149]! } + public var Group_Setup_HistoryVisible: String { return self._s[1150]! } + public var Channel_EditAdmin_PermissinAddAdminOff: String { return self._s[1151]! } + public var DialogList_ProxyConnectionIssuesTooltip: String { return self._s[1153]! } + public var Cache_Files: String { return self._s[1154]! } + public var PhotoEditor_EnhanceTool: String { return self._s[1156]! } + public var Conversation_SearchPlaceholder: String { return self._s[1157]! } + public var Channel_Stickers_NotFound: String { return self._s[1158]! } + public var UserInfo_NotificationsDefaultEnabled: String { return self._s[1162]! } + public var Login_CodeExpired: String { return self._s[1163]! } + public var WatchRemote_AlertText: String { return self._s[1164]! } + public var Channel_AdminLog_CanInviteUsers: String { return self._s[1166]! } + public var Channel_BanUser_PermissionReadMessages: String { return self._s[1168]! } + public var AttachmentMenu_PhotoOrVideo: String { return self._s[1169]! } + public var Passport_Identity_GenderPlaceholder: String { return self._s[1170]! } + public var Month_ShortMarch: String { return self._s[1171]! } + public var GroupInfo_InviteLink_Title: String { return self._s[1172]! } + public var Watch_LastSeen_JustNow: String { return self._s[1173]! } + public var PhoneLabel_Title: String { return self._s[1174]! } + public var PrivacySettings_Passcode: String { return self._s[1176]! } + public var Paint_ClearConfirm: String { return self._s[1178]! } + public var SocksProxySetup_Secret: String { return self._s[1179]! } public func Checkout_SavePasswordTimeout(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1169]!, self._r[1169]!, [_0]) + return formatWithArgumentRanges(self._s[1180]!, self._r[1180]!, [_0]) } - public var PhotoEditor_BlurToolOff: String { return self._s[1170]! } - public var AccessDenied_VideoMicrophone: String { return self._s[1171]! } - public var Weekday_ShortThursday: String { return self._s[1172]! } - public var UserInfo_ShareContact: String { return self._s[1173]! } - public var LoginPassword_InvalidPasswordError: String { return self._s[1174]! } - public var NotificationsSound_Calypso: String { return self._s[1176]! } + public var PhotoEditor_BlurToolOff: String { return self._s[1181]! } + public var AccessDenied_VideoMicrophone: String { return self._s[1182]! } + public var Weekday_ShortThursday: String { return self._s[1183]! } + public var UserInfo_ShareContact: String { return self._s[1184]! } + public var LoginPassword_InvalidPasswordError: String { return self._s[1185]! } + public var NotificationsSound_Calypso: String { return self._s[1187]! } public func MESSAGE_PHOTO_SECRET(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1177]!, self._r[1177]!, [_1]) + return formatWithArgumentRanges(self._s[1188]!, self._r[1188]!, [_1]) } - public var Login_PhoneAndCountryHelp: String { return self._s[1178]! } - public var CheckoutInfo_ReceiverInfoName: String { return self._s[1179]! } - public var NotificationsSound_Popcorn: String { return self._s[1181]! } + public var Login_PhoneAndCountryHelp: String { return self._s[1189]! } + public var CheckoutInfo_ReceiverInfoName: String { return self._s[1190]! } + public var NotificationsSound_Popcorn: String { return self._s[1192]! } public func Time_YesterdayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1182]!, self._r[1182]!, [_0]) - } - public var Weekday_Yesterday: String { return self._s[1183]! } - public var Conversation_InputTextSilentBroadcastPlaceholder: String { return self._s[1184]! } - public var Embed_PlayingInPIP: String { return self._s[1185]! } - public var Localization_EnglishLanguageName: String { return self._s[1186]! } - public var Call_StatusIncoming: String { return self._s[1187]! } - public var Settings_Appearance: String { return self._s[1188]! } - public func ApplyLanguage_ChangeLanguageAlreadyActive(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1190]!, self._r[1190]!, [_1]) - } - public var Settings_PrivacySettings: String { return self._s[1191]! } - public var Conversation_SilentBroadcastTooltipOn: String { return self._s[1192]! } - public func SecretVideo_NotViewedYet(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[1193]!, self._r[1193]!, [_0]) } + public var Weekday_Yesterday: String { return self._s[1194]! } + public var Conversation_InputTextSilentBroadcastPlaceholder: String { return self._s[1195]! } + public var Embed_PlayingInPIP: String { return self._s[1196]! } + public var Localization_EnglishLanguageName: String { return self._s[1197]! } + public var Call_StatusIncoming: String { return self._s[1198]! } + public var Settings_Appearance: String { return self._s[1199]! } + public func ApplyLanguage_ChangeLanguageAlreadyActive(_ _1: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[1201]!, self._r[1201]!, [_1]) + } + public var Settings_PrivacySettings: String { return self._s[1202]! } + public var Conversation_SilentBroadcastTooltipOn: String { return self._s[1203]! } + public func SecretVideo_NotViewedYet(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[1204]!, self._r[1204]!, [_0]) + } public func CHAT_MESSAGE_GEO(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1194]!, self._r[1194]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1205]!, self._r[1205]!, [_1, _2]) } - public var DialogList_SearchLabel: String { return self._s[1196]! } - public var InfoPlist_NSLocationAlwaysAndWhenInUseUsageDescription: String { return self._s[1197]! } - public var Login_CodeSentInternal: String { return self._s[1198]! } - public var Channel_AdminLog_BanSendMessages: String { return self._s[1200]! } - public var Channel_MessagePhotoRemoved: String { return self._s[1201]! } - public var Conversation_StatusKickedFromGroup: String { return self._s[1202]! } - public var GroupInfo_ChatAdmins: String { return self._s[1203]! } - public var PhotoEditor_CurvesAll: String { return self._s[1204]! } + public var DialogList_SearchLabel: String { return self._s[1207]! } + public var InfoPlist_NSLocationAlwaysAndWhenInUseUsageDescription: String { return self._s[1208]! } + public var Login_CodeSentInternal: String { return self._s[1209]! } + public var Channel_AdminLog_BanSendMessages: String { return self._s[1211]! } + public var Channel_MessagePhotoRemoved: String { return self._s[1212]! } + public var Conversation_StatusKickedFromGroup: String { return self._s[1213]! } + public var GroupInfo_ChatAdmins: String { return self._s[1214]! } + public var PhotoEditor_CurvesAll: String { return self._s[1215]! } public func Notification_LeftChannel(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1205]!, self._r[1205]!, [_0]) + return formatWithArgumentRanges(self._s[1216]!, self._r[1216]!, [_0]) } - public var Compose_Create: String { return self._s[1206]! } + public var Compose_Create: String { return self._s[1217]! } public func Passport_Identity_NativeNameGenericHelp(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1207]!, self._r[1207]!, [_0]) + return formatWithArgumentRanges(self._s[1218]!, self._r[1218]!, [_0]) } public func LOCKED_MESSAGE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1208]!, self._r[1208]!, [_1]) + return formatWithArgumentRanges(self._s[1219]!, self._r[1219]!, [_1]) } - public var Conversation_ClearPrivateHistory: String { return self._s[1209]! } - public var Conversation_ContextMenuShare: String { return self._s[1210]! } - public var Notifications_ExceptionsNone: String { return self._s[1211]! } + public var Conversation_ClearPrivateHistory: String { return self._s[1220]! } + public var Conversation_ContextMenuShare: String { return self._s[1221]! } + public var Notifications_ExceptionsNone: String { return self._s[1222]! } public func Time_MonthOfYear_m6(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1212]!, self._r[1212]!, [_0]) + return formatWithArgumentRanges(self._s[1223]!, self._r[1223]!, [_0]) } - public var Conversation_ContextMenuReport: String { return self._s[1213]! } + public var Conversation_ContextMenuReport: String { return self._s[1224]! } public func Call_GroupFormat(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1215]!, self._r[1215]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1226]!, self._r[1226]!, [_1, _2]) } - public var Forward_ChannelReadOnly: String { return self._s[1216]! } - public var Passport_InfoText: String { return self._s[1218]! } - public var Privacy_GroupsAndChannels_NeverAllow_Title: String { return self._s[1219]! } + public var Forward_ChannelReadOnly: String { return self._s[1227]! } + public var Passport_InfoText: String { return self._s[1229]! } + public var Privacy_GroupsAndChannels_NeverAllow_Title: String { return self._s[1230]! } public func Passport_Address_UploadOneOfScan(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1220]!, self._r[1220]!, [_0]) + return formatWithArgumentRanges(self._s[1231]!, self._r[1231]!, [_0]) } - public var AutoDownloadSettings_Reset: String { return self._s[1221]! } - public var NotificationsSound_Synth: String { return self._s[1222]! } - public var TextFormat_Bold: String { return self._s[1223]! } + public var AutoDownloadSettings_Reset: String { return self._s[1232]! } + public var NotificationsSound_Synth: String { return self._s[1233]! } + public var TextFormat_Bold: String { return self._s[1234]! } public func Channel_AdminLog_MessageInvitedName(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1224]!, self._r[1224]!, [_1]) + return formatWithArgumentRanges(self._s[1235]!, self._r[1235]!, [_1]) } - public var Conversation_Moderate_Ban: String { return self._s[1227]! } - public var Group_Status: String { return self._s[1229]! } - public var SocksProxySetup_ShareProxyList: String { return self._s[1232]! } - public var Passport_Phone_Delete: String { return self._s[1233]! } - public var Conversation_InputTextPlaceholder: String { return self._s[1234]! } - public var ContactInfo_PhoneLabelOther: String { return self._s[1235]! } - public var Passport_Language_lv: String { return self._s[1237]! } - public var TwoStepAuth_RecoveryCode: String { return self._s[1238]! } - public var Conversation_EditingMessageMediaEditCurrentPhoto: String { return self._s[1239]! } - public var Passport_DeleteDocumentConfirmation: String { return self._s[1240]! } - public var Passport_Language_hy: String { return self._s[1241]! } - public var SharedMedia_CategoryDocs: String { return self._s[1244]! } - public var Channel_AdminLog_CanChangeInfo: String { return self._s[1246]! } - public var Channel_AdminLogFilter_EventsAdmins: String { return self._s[1247]! } - public var Group_Setup_HistoryHiddenHelp: String { return self._s[1248]! } + public var Conversation_Moderate_Ban: String { return self._s[1238]! } + public var Group_Status: String { return self._s[1240]! } + public var SocksProxySetup_ShareProxyList: String { return self._s[1243]! } + public var Passport_Phone_Delete: String { return self._s[1244]! } + public var Conversation_InputTextPlaceholder: String { return self._s[1245]! } + public var ContactInfo_PhoneLabelOther: String { return self._s[1246]! } + public var Passport_Language_lv: String { return self._s[1248]! } + public var TwoStepAuth_RecoveryCode: String { return self._s[1249]! } + public var Conversation_EditingMessageMediaEditCurrentPhoto: String { return self._s[1250]! } + public var Passport_DeleteDocumentConfirmation: String { return self._s[1251]! } + public var Passport_Language_hy: String { return self._s[1252]! } + public var Permissions_PrivacyPolicy: String { return self._s[1253]! } + public var SharedMedia_CategoryDocs: String { return self._s[1256]! } + public var Channel_AdminLog_CanChangeInfo: String { return self._s[1258]! } + public var Channel_AdminLogFilter_EventsAdmins: String { return self._s[1259]! } + public var Group_Setup_HistoryHiddenHelp: String { return self._s[1260]! } public func AuthSessions_AppUnofficial(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1249]!, self._r[1249]!, [_0]) + return formatWithArgumentRanges(self._s[1261]!, self._r[1261]!, [_0]) } - public var NotificationsSound_Telegraph: String { return self._s[1250]! } - public var AutoNightTheme_Disabled: String { return self._s[1251]! } - public var Conversation_ContextMenuBan: String { return self._s[1252]! } - public var Channel_EditAdmin_PermissionsHeader: String { return self._s[1253]! } - public var SocksProxySetup_PortPlaceholder: String { return self._s[1254]! } + public var NotificationsSound_Telegraph: String { return self._s[1262]! } + public var AutoNightTheme_Disabled: String { return self._s[1263]! } + public var Conversation_ContextMenuBan: String { return self._s[1264]! } + public var Channel_EditAdmin_PermissionsHeader: String { return self._s[1265]! } + public var SocksProxySetup_PortPlaceholder: String { return self._s[1266]! } public func DialogList_SingleUploadingVideoSuffix(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1256]!, self._r[1256]!, [_0]) + return formatWithArgumentRanges(self._s[1268]!, self._r[1268]!, [_0]) } - public var Group_UpgradeNoticeHeader: String { return self._s[1257]! } + public var Group_UpgradeNoticeHeader: String { return self._s[1269]! } public func CHAT_DELETE_YOU(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1258]!, self._r[1258]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1270]!, self._r[1270]!, [_1, _2]) } public func MESSAGE_NOTEXT(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1259]!, self._r[1259]!, [_1]) + return formatWithArgumentRanges(self._s[1271]!, self._r[1271]!, [_1]) } public func ApplyLanguage_ChangeLanguageUnofficialText(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1260]!, self._r[1260]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1272]!, self._r[1272]!, [_1, _2]) } public func CHAT_MESSAGE_GIF(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1262]!, self._r[1262]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1274]!, self._r[1274]!, [_1, _2]) } - public var GroupInfo_InviteLink_CopyAlert_Success: String { return self._s[1263]! } - public var Channel_Info_Members: String { return self._s[1264]! } - public var ShareFileTip_CloseTip: String { return self._s[1265]! } - public var KeyCommand_Find: String { return self._s[1266]! } - public var SecretVideo_Title: String { return self._s[1267]! } - public var Passport_DeleteAddressConfirmation: String { return self._s[1268]! } - public var Passport_DiscardMessageAction: String { return self._s[1269]! } - public var Passport_Language_dv: String { return self._s[1270]! } - public var Checkout_NewCard_PostcodeTitle: String { return self._s[1271]! } - public var Notifications_Badge_CountUnreadMessages_InfoOn: String { return self._s[1273]! } + public var GroupInfo_InviteLink_CopyAlert_Success: String { return self._s[1275]! } + public var Channel_Info_Members: String { return self._s[1276]! } + public var ShareFileTip_CloseTip: String { return self._s[1277]! } + public var KeyCommand_Find: String { return self._s[1278]! } + public var SecretVideo_Title: String { return self._s[1279]! } + public var Passport_DeleteAddressConfirmation: String { return self._s[1280]! } + public var Passport_DiscardMessageAction: String { return self._s[1281]! } + public var Passport_Language_dv: String { return self._s[1282]! } + public var Checkout_NewCard_PostcodeTitle: String { return self._s[1283]! } + public var Notifications_Badge_CountUnreadMessages_InfoOn: String { return self._s[1285]! } public func Channel_AdminLog_MessageRestricted(_ _0: String, _ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1274]!, self._r[1274]!, [_0, _1, _2]) + return formatWithArgumentRanges(self._s[1286]!, self._r[1286]!, [_0, _1, _2]) } - public var SocksProxySetup_SecretPlaceholder: String { return self._s[1275]! } - public var Channel_EditAdmin_PermissinAddAdminOn: String { return self._s[1276]! } - public var WebSearch_GIFs: String { return self._s[1277]! } - public var Privacy_ChatsTitle: String { return self._s[1278]! } - public var Conversation_SavedMessages: String { return self._s[1279]! } - public var TwoStepAuth_EnterPasswordTitle: String { return self._s[1280]! } + public var SocksProxySetup_SecretPlaceholder: String { return self._s[1287]! } + public var Channel_EditAdmin_PermissinAddAdminOn: String { return self._s[1288]! } + public var WebSearch_GIFs: String { return self._s[1289]! } + public var Privacy_ChatsTitle: String { return self._s[1290]! } + public var Conversation_SavedMessages: String { return self._s[1291]! } + public var TwoStepAuth_EnterPasswordTitle: String { return self._s[1292]! } public func CHANNEL_MESSAGE_GAME(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1281]!, self._r[1281]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1293]!, self._r[1293]!, [_1, _2]) } - public var Channel_Subscribers_Title: String { return self._s[1282]! } - public var AccessDenied_CallMicrophone: String { return self._s[1283]! } - public var Conversation_DeleteMessagesForEveryone: String { return self._s[1284]! } - public var AuthSessions_Terminate: String { return self._s[1285]! } - public var UserInfo_TapToCall: String { return self._s[1286]! } - public var Common_Edit: String { return self._s[1287]! } - public var TwoStepAuth_AddHintDescription: String { return self._s[1289]! } - public var Conversation_OpenFile: String { return self._s[1290]! } - public var PrivacyPolicy_Decline: String { return self._s[1292]! } - public var Passport_Identity_ResidenceCountryPlaceholder: String { return self._s[1293]! } - public var Message_PinnedDocumentMessage: String { return self._s[1294]! } - public var AuthSessions_LogOut: String { return self._s[1296]! } - public var Settings_AppLanguage_Unofficial: String { return self._s[1298]! } - public var AutoDownloadSettings_PrivateChats: String { return self._s[1299]! } - public var Checkout_TotalPaidAmount: String { return self._s[1300]! } - public var Conversation_UnsupportedMedia: String { return self._s[1301]! } - public var Passport_InvalidPasswordError: String { return self._s[1302]! } + public var Channel_Subscribers_Title: String { return self._s[1294]! } + public var AccessDenied_CallMicrophone: String { return self._s[1295]! } + public var Conversation_DeleteMessagesForEveryone: String { return self._s[1296]! } + public var AuthSessions_Terminate: String { return self._s[1297]! } + public var UserInfo_TapToCall: String { return self._s[1298]! } + public var Common_Edit: String { return self._s[1299]! } + public var TwoStepAuth_AddHintDescription: String { return self._s[1301]! } + public var Conversation_OpenFile: String { return self._s[1302]! } + public var PrivacyPolicy_Decline: String { return self._s[1304]! } + public var Passport_Identity_ResidenceCountryPlaceholder: String { return self._s[1305]! } + public var Message_PinnedDocumentMessage: String { return self._s[1306]! } + public var AuthSessions_LogOut: String { return self._s[1308]! } + public var Settings_AppLanguage_Unofficial: String { return self._s[1310]! } + public var AutoDownloadSettings_PrivateChats: String { return self._s[1311]! } + public var Checkout_TotalPaidAmount: String { return self._s[1312]! } + public var Conversation_UnsupportedMedia: String { return self._s[1313]! } + public var Passport_InvalidPasswordError: String { return self._s[1314]! } public func Message_ForwardedMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1304]!, self._r[1304]!, [_0]) + return formatWithArgumentRanges(self._s[1316]!, self._r[1316]!, [_0]) } public func Time_PreciseDate_m4(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1305]!, self._r[1305]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1317]!, self._r[1317]!, [_1, _2, _3]) } - public var Checkout_NewCard_SaveInfoEnableHelp: String { return self._s[1306]! } - public var Call_AudioRouteHide: String { return self._s[1307]! } - public var CallSettings_OnMobile: String { return self._s[1309]! } - public var Conversation_GifTooltip: String { return self._s[1310]! } - public var Passport_Address_EditBankStatement: String { return self._s[1311]! } - public var CheckoutInfo_ErrorCityInvalid: String { return self._s[1313]! } + public var Checkout_NewCard_SaveInfoEnableHelp: String { return self._s[1318]! } + public var Call_AudioRouteHide: String { return self._s[1319]! } + public var CallSettings_OnMobile: String { return self._s[1321]! } + public var Conversation_GifTooltip: String { return self._s[1322]! } + public var Passport_Address_EditBankStatement: String { return self._s[1323]! } + public var CheckoutInfo_ErrorCityInvalid: String { return self._s[1325]! } public func CHANNEL_MESSAGE_PHOTOS(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1314]!, self._r[1314]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1326]!, self._r[1326]!, [_1, _2]) } - public var Profile_CreateEncryptedChatError: String { return self._s[1315]! } - public var Map_LocationTitle: String { return self._s[1316]! } - public var Call_RateCall: String { return self._s[1317]! } - public var Login_CancelPhoneVerificationStop: String { return self._s[1318]! } - public var Passport_Address_City: String { return self._s[1319]! } - public var SocksProxySetup_PasswordPlaceholder: String { return self._s[1320]! } - public var Message_ReplyActionButtonShowReceipt: String { return self._s[1322]! } - public var PhotoEditor_ShadowsTool: String { return self._s[1323]! } - public var Checkout_NewCard_CardholderNamePlaceholder: String { return self._s[1325]! } - public var Cache_Title: String { return self._s[1327]! } - public var Passport_Email_Title: String { return self._s[1328]! } - public var Month_GenMay: String { return self._s[1329]! } - public var PasscodeSettings_HelpBottom: String { return self._s[1330]! } + public var Profile_CreateEncryptedChatError: String { return self._s[1327]! } + public var Map_LocationTitle: String { return self._s[1328]! } + public var Call_RateCall: String { return self._s[1329]! } + public var Login_CancelPhoneVerificationStop: String { return self._s[1330]! } + public var Passport_Address_City: String { return self._s[1331]! } + public var SocksProxySetup_PasswordPlaceholder: String { return self._s[1332]! } + public var Message_ReplyActionButtonShowReceipt: String { return self._s[1334]! } + public var PhotoEditor_ShadowsTool: String { return self._s[1335]! } + public var Checkout_NewCard_CardholderNamePlaceholder: String { return self._s[1337]! } + public var Cache_Title: String { return self._s[1339]! } + public var Passport_Email_Title: String { return self._s[1340]! } + public var Month_GenMay: String { return self._s[1341]! } + public var PasscodeSettings_HelpBottom: String { return self._s[1342]! } public func Notification_CreatedChat(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1331]!, self._r[1331]!, [_0]) + return formatWithArgumentRanges(self._s[1343]!, self._r[1343]!, [_0]) } - public var Calls_NoMissedCallsPlacehoder: String { return self._s[1332]! } - public var Passport_Address_RegionPlaceholder: String { return self._s[1333]! } - public var Channel_Stickers_NotFoundHelp: String { return self._s[1334]! } - public var Watch_UserInfo_Block: String { return self._s[1335]! } - public var Watch_LastSeen_ALongTimeAgo: String { return self._s[1336]! } - public var StickerPacksSettings_ManagingHelp: String { return self._s[1337]! } - public var Privacy_GroupsAndChannels_InviteToChannelMultipleError: String { return self._s[1338]! } - public var SearchImages_Title: String { return self._s[1339]! } - public var Channel_BlackList_Title: String { return self._s[1340]! } + public var Calls_NoMissedCallsPlacehoder: String { return self._s[1344]! } + public var Passport_Address_RegionPlaceholder: String { return self._s[1345]! } + public var Channel_Stickers_NotFoundHelp: String { return self._s[1346]! } + public var Watch_UserInfo_Block: String { return self._s[1347]! } + public var Watch_LastSeen_ALongTimeAgo: String { return self._s[1348]! } + public var StickerPacksSettings_ManagingHelp: String { return self._s[1349]! } + public var Privacy_GroupsAndChannels_InviteToChannelMultipleError: String { return self._s[1350]! } + public var SearchImages_Title: String { return self._s[1351]! } + public var Channel_BlackList_Title: String { return self._s[1352]! } public func Conversation_LiveLocationYouAnd(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1342]!, self._r[1342]!, [_0]) + return formatWithArgumentRanges(self._s[1354]!, self._r[1354]!, [_0]) } - public var TwoStepAuth_PasswordRemovePassportConfirmation: String { return self._s[1343]! } - public var Checkout_NewCard_SaveInfo: String { return self._s[1344]! } - public var Notification_CallMissed: String { return self._s[1345]! } - public var Profile_ShareContactButton: String { return self._s[1346]! } - public var Group_ErrorSendRestrictedStickers: String { return self._s[1347]! } - public var Bot_GroupStatusDoesNotReadHistory: String { return self._s[1348]! } - public var Notification_Mute1h: String { return self._s[1349]! } + public var TwoStepAuth_PasswordRemovePassportConfirmation: String { return self._s[1355]! } + public var Checkout_NewCard_SaveInfo: String { return self._s[1356]! } + public var Notification_CallMissed: String { return self._s[1357]! } + public var Profile_ShareContactButton: String { return self._s[1358]! } + public var Group_ErrorSendRestrictedStickers: String { return self._s[1359]! } + public var Bot_GroupStatusDoesNotReadHistory: String { return self._s[1360]! } + public var Notification_Mute1h: String { return self._s[1361]! } public func Channel_AdminLog_MessageUnkickedName(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1350]!, self._r[1350]!, [_1]) + return formatWithArgumentRanges(self._s[1362]!, self._r[1362]!, [_1]) } - public var Settings_TabTitle: String { return self._s[1351]! } - public var Passport_Identity_ExpiryDatePlaceholder: String { return self._s[1353]! } - public var NetworkUsageSettings_MediaAudioDataSection: String { return self._s[1354]! } - public var GroupInfo_DeactivatedStatus: String { return self._s[1355]! } + public var Passport_Identity_ExpiryDatePlaceholder: String { return self._s[1364]! } + public var NetworkUsageSettings_MediaAudioDataSection: String { return self._s[1365]! } + public var GroupInfo_DeactivatedStatus: String { return self._s[1366]! } public func CHAT_PHOTO_EDITED(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1356]!, self._r[1356]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1367]!, self._r[1367]!, [_1, _2]) } - public var Conversation_ContextMenuMore: String { return self._s[1357]! } + public var Conversation_ContextMenuMore: String { return self._s[1368]! } public func PrivacySettings_LastSeenEverybodyMinus(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1358]!, self._r[1358]!, [_0]) + return formatWithArgumentRanges(self._s[1369]!, self._r[1369]!, [_0]) } - public var Map_ShareLiveLocation: String { return self._s[1359]! } - public var Weekday_Today: String { return self._s[1360]! } + public var Map_ShareLiveLocation: String { return self._s[1370]! } + public var Weekday_Today: String { return self._s[1371]! } public func PINNED_GEOLIVE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1361]!, self._r[1361]!, [_1]) + return formatWithArgumentRanges(self._s[1372]!, self._r[1372]!, [_1]) } public func Conversation_RestrictedStickersTimed(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1362]!, self._r[1362]!, [_0]) + return formatWithArgumentRanges(self._s[1373]!, self._r[1373]!, [_0]) } - public var Login_InvalidFirstNameError: String { return self._s[1363]! } + public var Login_InvalidFirstNameError: String { return self._s[1374]! } public func Channel_AdminLog_MessageUnkickedNameUsername(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1364]!, self._r[1364]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1375]!, self._r[1375]!, [_1, _2]) } public func Notification_Joined(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1365]!, self._r[1365]!, [_0]) + return formatWithArgumentRanges(self._s[1376]!, self._r[1376]!, [_0]) } public func ApplyLanguage_UnsufficientDataText(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1366]!, self._r[1366]!, [_1]) + return formatWithArgumentRanges(self._s[1377]!, self._r[1377]!, [_1]) } - public var Paint_Clear: String { return self._s[1367]! } - public var TwoStepAuth_RecoveryFailed: String { return self._s[1369]! } + public var Paint_Clear: String { return self._s[1378]! } + public var TwoStepAuth_RecoveryFailed: String { return self._s[1380]! } public func MESSAGE_AUDIO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1370]!, self._r[1370]!, [_1]) + return formatWithArgumentRanges(self._s[1381]!, self._r[1381]!, [_1]) } - public var Checkout_PasswordEntry_Pay: String { return self._s[1371]! } - public var Conversation_EditingMessagePanelMedia: String { return self._s[1372]! } - public var Notifications_MessageNotificationsHelp: String { return self._s[1373]! } - public var EnterPasscode_EnterCurrentPasscode: String { return self._s[1374]! } - public var Conversation_EditingMessageMediaEditCurrentVideo: String { return self._s[1375]! } + public var Checkout_PasswordEntry_Pay: String { return self._s[1382]! } + public var Conversation_EditingMessagePanelMedia: String { return self._s[1383]! } + public var Notifications_MessageNotificationsHelp: String { return self._s[1384]! } + public var EnterPasscode_EnterCurrentPasscode: String { return self._s[1385]! } + public var Conversation_EditingMessageMediaEditCurrentVideo: String { return self._s[1386]! } public func MESSAGE_GAME(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1376]!, self._r[1376]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1387]!, self._r[1387]!, [_1, _2]) } - public var Conversation_Moderate_Report: String { return self._s[1377]! } - public var MessageTimer_Forever: String { return self._s[1378]! } - public var DialogList_SavedMessagesHelp: String { return self._s[1379]! } + public var Conversation_Moderate_Report: String { return self._s[1388]! } + public var MessageTimer_Forever: String { return self._s[1389]! } + public var DialogList_SavedMessagesHelp: String { return self._s[1390]! } public func Conversation_EncryptedPlaceholderTitleIncoming(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1380]!, self._r[1380]!, [_0]) + return formatWithArgumentRanges(self._s[1391]!, self._r[1391]!, [_0]) } public func Map_AccurateTo(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1382]!, self._r[1382]!, [_0]) + return formatWithArgumentRanges(self._s[1393]!, self._r[1393]!, [_0]) } public func Call_ParticipantVersionOutdatedError(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1383]!, self._r[1383]!, [_0]) + return formatWithArgumentRanges(self._s[1394]!, self._r[1394]!, [_0]) } - public var Passport_Identity_ReverseSideHelp: String { return self._s[1384]! } - public var Tour_Text2: String { return self._s[1385]! } - public var Call_StatusNoAnswer: String { return self._s[1387]! } + public var Passport_Identity_ReverseSideHelp: String { return self._s[1395]! } + public var Tour_Text2: String { return self._s[1396]! } + public var Call_StatusNoAnswer: String { return self._s[1398]! } public func Passport_Phone_UseTelegramNumber(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1388]!, self._r[1388]!, [_0]) + return formatWithArgumentRanges(self._s[1399]!, self._r[1399]!, [_0]) } - public var Channel_AdminLogFilter_EventsLeavingSubscribers: String { return self._s[1389]! } - public var Conversation_MessageDialogDelete: String { return self._s[1392]! } - public var Appearance_PreviewOutgoingText: String { return self._s[1393]! } - public var Login_CheckOtherSessionMessages: String { return self._s[1394]! } - public var Username_Placeholder: String { return self._s[1395]! } + public var Channel_AdminLogFilter_EventsLeavingSubscribers: String { return self._s[1400]! } + public var Conversation_MessageDialogDelete: String { return self._s[1403]! } + public var Appearance_PreviewOutgoingText: String { return self._s[1404]! } + public var Login_CheckOtherSessionMessages: String { return self._s[1405]! } + public var Username_Placeholder: String { return self._s[1406]! } public func Notification_PinnedDeletedMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1396]!, self._r[1396]!, [_0]) + return formatWithArgumentRanges(self._s[1407]!, self._r[1407]!, [_0]) } public func Time_MonthOfYear_m11(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1397]!, self._r[1397]!, [_0]) + return formatWithArgumentRanges(self._s[1408]!, self._r[1408]!, [_0]) } - public var TwoStepAuth_ReEnterPasswordTitle: String { return self._s[1398]! } - public var UserInfo_BotHelp: String { return self._s[1399]! } - public var TwoStepAuth_PasswordSet: String { return self._s[1400]! } + public var TwoStepAuth_ReEnterPasswordTitle: String { return self._s[1409]! } + public var UserInfo_BotHelp: String { return self._s[1410]! } + public var TwoStepAuth_PasswordSet: String { return self._s[1411]! } public func CHANNEL_MESSAGE_VIDEO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1401]!, self._r[1401]!, [_1]) + return formatWithArgumentRanges(self._s[1412]!, self._r[1412]!, [_1]) } - public var EnterPasscode_TouchId: String { return self._s[1402]! } - public var AuthSessions_LoggedInWithTelegram: String { return self._s[1403]! } - public var Checkout_ErrorInvoiceAlreadyPaid: String { return self._s[1406]! } - public var ChatAdmins_Title: String { return self._s[1407]! } - public var ChannelMembers_WhoCanAddMembers: String { return self._s[1408]! } - public var Passport_Language_ar: String { return self._s[1409]! } - public var PasscodeSettings_Help: String { return self._s[1410]! } - public var Conversation_EditingMessagePanelTitle: String { return self._s[1411]! } - public var Settings_AboutEmpty: String { return self._s[1412]! } + public var EnterPasscode_TouchId: String { return self._s[1413]! } + public var AuthSessions_LoggedInWithTelegram: String { return self._s[1414]! } + public var Checkout_ErrorInvoiceAlreadyPaid: String { return self._s[1417]! } + public var ChatAdmins_Title: String { return self._s[1418]! } + public var ChannelMembers_WhoCanAddMembers: String { return self._s[1419]! } + public var Passport_Language_ar: String { return self._s[1420]! } + public var PasscodeSettings_Help: String { return self._s[1421]! } + public var Conversation_EditingMessagePanelTitle: String { return self._s[1422]! } + public var Settings_AboutEmpty: String { return self._s[1423]! } public func NetworkUsageSettings_CellularUsageSince(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1413]!, self._r[1413]!, [_0]) + return formatWithArgumentRanges(self._s[1424]!, self._r[1424]!, [_0]) } - public var GroupInfo_ConvertToSupergroup: String { return self._s[1414]! } + public var GroupInfo_ConvertToSupergroup: String { return self._s[1425]! } public func Notification_PinnedContactMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1415]!, self._r[1415]!, [_0]) + return formatWithArgumentRanges(self._s[1426]!, self._r[1426]!, [_0]) } - public var CallSettings_UseLessDataLongDescription: String { return self._s[1416]! } - public var FastTwoStepSetup_PasswordPlaceholder: String { return self._s[1417]! } - public var Conversation_SecretChatContextBotAlert: String { return self._s[1418]! } - public var Channel_Moderator_AccessLevelRevoke: String { return self._s[1419]! } - public var CheckoutInfo_ReceiverInfoTitle: String { return self._s[1420]! } - public var Channel_AdminLogFilter_EventsRestrictions: String { return self._s[1421]! } - public var GroupInfo_InviteLink_RevokeLink: String { return self._s[1423]! } - public var Checkout_PaymentMethod_Title: String { return self._s[1424]! } - public var Conversation_Unmute: String { return self._s[1425]! } - public var AutoDownloadSettings_DocumentsTitle: String { return self._s[1426]! } - public var Passport_FieldOneOf_FinalDelimeter: String { return self._s[1428]! } - public var Notifications_MessageNotifications: String { return self._s[1429]! } - public var Passport_ForgottenPassword: String { return self._s[1431]! } - public var ChannelMembers_WhoCanAddMembersAdminsHelp: String { return self._s[1432]! } - public var DialogList_DeleteBotConversationConfirmation: String { return self._s[1433]! } - public var Passport_Identity_TranslationHelp: String { return self._s[1434]! } + public var CallSettings_UseLessDataLongDescription: String { return self._s[1427]! } + public var FastTwoStepSetup_PasswordPlaceholder: String { return self._s[1428]! } + public var Conversation_SecretChatContextBotAlert: String { return self._s[1429]! } + public var Channel_Moderator_AccessLevelRevoke: String { return self._s[1430]! } + public var CheckoutInfo_ReceiverInfoTitle: String { return self._s[1431]! } + public var Channel_AdminLogFilter_EventsRestrictions: String { return self._s[1432]! } + public var GroupInfo_InviteLink_RevokeLink: String { return self._s[1434]! } + public var Checkout_PaymentMethod_Title: String { return self._s[1435]! } + public var Conversation_Unmute: String { return self._s[1436]! } + public var AutoDownloadSettings_DocumentsTitle: String { return self._s[1437]! } + public var Passport_FieldOneOf_FinalDelimeter: String { return self._s[1439]! } + public var Notifications_MessageNotifications: String { return self._s[1440]! } + public var Passport_ForgottenPassword: String { return self._s[1442]! } + public var ChannelMembers_WhoCanAddMembersAdminsHelp: String { return self._s[1443]! } + public var DialogList_DeleteBotConversationConfirmation: String { return self._s[1444]! } + public var Passport_Identity_TranslationHelp: String { return self._s[1445]! } public func Update_AppVersion(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1435]!, self._r[1435]!, [_0]) + return formatWithArgumentRanges(self._s[1446]!, self._r[1446]!, [_0]) } public func DialogList_MultipleTyping(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1436]!, self._r[1436]!, [_0, _1]) + return formatWithArgumentRanges(self._s[1447]!, self._r[1447]!, [_0, _1]) } - public var Passport_Identity_OneOfTypeIdentityCard: String { return self._s[1437]! } - public var Conversation_ClousStorageInfo_Description2: String { return self._s[1438]! } + public var Passport_Identity_OneOfTypeIdentityCard: String { return self._s[1448]! } + public var Conversation_ClousStorageInfo_Description2: String { return self._s[1449]! } public func Time_MonthOfYear_m5(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1439]!, self._r[1439]!, [_0]) + return formatWithArgumentRanges(self._s[1450]!, self._r[1450]!, [_0]) } - public var Map_Hybrid: String { return self._s[1440]! } - public var Channel_Setup_Title: String { return self._s[1441]! } - public var MediaPicker_TimerTooltip: String { return self._s[1442]! } - public var Activity_UploadingVideo: String { return self._s[1443]! } - public var Channel_Info_Management: String { return self._s[1444]! } + public var Map_Hybrid: String { return self._s[1451]! } + public var Channel_Setup_Title: String { return self._s[1452]! } + public var MediaPicker_TimerTooltip: String { return self._s[1453]! } + public var Activity_UploadingVideo: String { return self._s[1454]! } + public var Channel_Info_Management: String { return self._s[1455]! } public func Login_TermsOfService_ProceedBot(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1445]!, self._r[1445]!, [_0]) - } - public var TwoStepAuth_ConfirmEmailCodePlaceholder: String { return self._s[1446]! } - public func Notification_MessageLifetimeChangedOutgoing(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1447]!, self._r[1447]!, [_1]) - } - public var PhotoEditor_QualityVeryLow: String { return self._s[1448]! } - public var Stickers_AddToFavorites: String { return self._s[1449]! } - public var Month_ShortFebruary: String { return self._s[1450]! } - public var Notifications_AddExceptionTitle: String { return self._s[1451]! } - public var Conversation_ForwardTitle: String { return self._s[1452]! } - public var Settings_FAQ_URL: String { return self._s[1453]! } - public var Activity_RecordingVideoMessage: String { return self._s[1454]! } - public var SharedMedia_EmptyFilesText: String { return self._s[1455]! } - public func Contacts_AccessDeniedHelpLandscape(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[1456]!, self._r[1456]!, [_0]) } - public var PasscodeSettings_UnlockWithTouchId: String { return self._s[1457]! } - public var Contacts_AccessDeniedHelpON: String { return self._s[1458]! } - public var Passport_Identity_AddInternalPassport: String { return self._s[1459]! } - public var NetworkUsageSettings_ResetStats: String { return self._s[1460]! } - public var Share_AuthDescription: String { return self._s[1461]! } + public var TwoStepAuth_ConfirmEmailCodePlaceholder: String { return self._s[1457]! } + public func Notification_MessageLifetimeChangedOutgoing(_ _1: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[1458]!, self._r[1458]!, [_1]) + } + public var PhotoEditor_QualityVeryLow: String { return self._s[1459]! } + public var Stickers_AddToFavorites: String { return self._s[1460]! } + public var Month_ShortFebruary: String { return self._s[1461]! } + public var Notifications_AddExceptionTitle: String { return self._s[1462]! } + public var Conversation_ForwardTitle: String { return self._s[1463]! } + public var Settings_FAQ_URL: String { return self._s[1464]! } + public var Activity_RecordingVideoMessage: String { return self._s[1465]! } + public var SharedMedia_EmptyFilesText: String { return self._s[1466]! } + public func Contacts_AccessDeniedHelpLandscape(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[1467]!, self._r[1467]!, [_0]) + } + public var PasscodeSettings_UnlockWithTouchId: String { return self._s[1468]! } + public var Contacts_AccessDeniedHelpON: String { return self._s[1469]! } + public var Passport_Identity_AddInternalPassport: String { return self._s[1470]! } + public var NetworkUsageSettings_ResetStats: String { return self._s[1471]! } + public var Share_AuthDescription: String { return self._s[1472]! } public func CHAT_MESSAGE_PHOTOS(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1462]!, self._r[1462]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1473]!, self._r[1473]!, [_1, _2, _3]) } public func PrivacySettings_LastSeenContactsMinusPlus(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1463]!, self._r[1463]!, [_0, _1]) + return formatWithArgumentRanges(self._s[1474]!, self._r[1474]!, [_0, _1]) } - public var Channel_AdminLog_EmptyMessageText: String { return self._s[1464]! } + public var Channel_AdminLog_EmptyMessageText: String { return self._s[1475]! } public func Notification_ChannelInviter(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1465]!, self._r[1465]!, [_0]) + return formatWithArgumentRanges(self._s[1476]!, self._r[1476]!, [_0]) } - public var SocksProxySetup_TypeSocks: String { return self._s[1466]! } - public var Profile_MessageLifetimeForever: String { return self._s[1467]! } - public var MediaPicker_UngroupDescription: String { return self._s[1468]! } + public var SocksProxySetup_TypeSocks: String { return self._s[1477]! } + public var Profile_MessageLifetimeForever: String { return self._s[1478]! } + public var MediaPicker_UngroupDescription: String { return self._s[1479]! } public func Checkout_SavePasswordTimeoutAndFaceId(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1469]!, self._r[1469]!, [_0]) + return formatWithArgumentRanges(self._s[1480]!, self._r[1480]!, [_0]) } - public var SocksProxySetup_Username: String { return self._s[1470]! } - public var Conversation_Edit: String { return self._s[1471]! } - public var TwoStepAuth_ResetAccountHelp: String { return self._s[1472]! } - public var Month_GenDecember: String { return self._s[1473]! } + public var SocksProxySetup_Username: String { return self._s[1481]! } + public var Conversation_Edit: String { return self._s[1482]! } + public var TwoStepAuth_ResetAccountHelp: String { return self._s[1483]! } + public var Month_GenDecember: String { return self._s[1484]! } public func Watch_LastSeen_YesterdayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1475]!, self._r[1475]!, [_0]) + return formatWithArgumentRanges(self._s[1486]!, self._r[1486]!, [_0]) } - public var Channel_ErrorAddBlocked: String { return self._s[1476]! } - public var Conversation_Unpin: String { return self._s[1477]! } - public var Call_RecordingDisabledMessage: String { return self._s[1479]! } - public var Passport_Address_TypeUtilityBill: String { return self._s[1480]! } - public var Conversation_UnblockUser: String { return self._s[1481]! } - public var Conversation_Unblock: String { return self._s[1482]! } + public var Channel_ErrorAddBlocked: String { return self._s[1487]! } + public var Conversation_Unpin: String { return self._s[1488]! } + public var Call_RecordingDisabledMessage: String { return self._s[1490]! } + public var Passport_Address_TypeUtilityBill: String { return self._s[1491]! } + public var Conversation_UnblockUser: String { return self._s[1492]! } + public var Conversation_Unblock: String { return self._s[1493]! } public func CHANNEL_MESSAGE_GIF(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1483]!, self._r[1483]!, [_1]) + return formatWithArgumentRanges(self._s[1494]!, self._r[1494]!, [_1]) } - public var Channel_AdminLogFilter_EventsEditedMessages: String { return self._s[1486]! } - public var AutoNightTheme_ScheduleSection: String { return self._s[1487]! } - public var Appearance_ThemeNightBlue: String { return self._s[1488]! } + public var Channel_AdminLogFilter_EventsEditedMessages: String { return self._s[1497]! } + public var AutoNightTheme_ScheduleSection: String { return self._s[1498]! } + public var Appearance_ThemeNightBlue: String { return self._s[1499]! } public func Passport_Scans_ScanIndex(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1489]!, self._r[1489]!, [_0]) + return formatWithArgumentRanges(self._s[1500]!, self._r[1500]!, [_0]) } - public var Channel_Username_InvalidTooShort: String { return self._s[1490]! } - public var Conversation_ViewGroup: String { return self._s[1491]! } - public var Watch_LastSeen_WithinAWeek: String { return self._s[1492]! } - public var BlockedUsers_SelectUserTitle: String { return self._s[1493]! } - public var Profile_MessageLifetime1w: String { return self._s[1494]! } - public var Passport_Address_TypeRentalAgreementUploadScan: String { return self._s[1497]! } - public var DialogList_TabTitle: String { return self._s[1498]! } - public var UserInfo_GenericPhoneLabel: String { return self._s[1499]! } + public var Channel_Username_InvalidTooShort: String { return self._s[1501]! } + public var Conversation_ViewGroup: String { return self._s[1502]! } + public var Watch_LastSeen_WithinAWeek: String { return self._s[1503]! } + public var BlockedUsers_SelectUserTitle: String { return self._s[1504]! } + public var Profile_MessageLifetime1w: String { return self._s[1505]! } + public var Passport_Address_TypeRentalAgreementUploadScan: String { return self._s[1508]! } + public var DialogList_TabTitle: String { return self._s[1509]! } + public var UserInfo_GenericPhoneLabel: String { return self._s[1510]! } public func Channel_AdminLog_MessagePromotedName(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1500]!, self._r[1500]!, [_1]) + return formatWithArgumentRanges(self._s[1511]!, self._r[1511]!, [_1]) } - public var Group_Members_AddMemberBotErrorNotAllowed: String { return self._s[1501]! } + public var Group_Members_AddMemberBotErrorNotAllowed: String { return self._s[1512]! } public func Username_LinkHint(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1502]!, self._r[1502]!, [_0]) + return formatWithArgumentRanges(self._s[1513]!, self._r[1513]!, [_0]) } - public var Map_StopLiveLocation: String { return self._s[1503]! } - public var Message_LiveLocation: String { return self._s[1504]! } - public var NetworkUsageSettings_Title: String { return self._s[1506]! } - public var CheckoutInfo_ShippingInfoPostcodePlaceholder: String { return self._s[1507]! } - public var InfoPlist_NSPhotoLibraryUsageDescription: String { return self._s[1508]! } - public var Wallpaper_Wallpaper: String { return self._s[1509]! } - public var GroupInfo_InviteLink_RevokeAlert_Revoke: String { return self._s[1510]! } - public var SharedMedia_TitleLink: String { return self._s[1512]! } + public var Map_StopLiveLocation: String { return self._s[1514]! } + public var Message_LiveLocation: String { return self._s[1515]! } + public var NetworkUsageSettings_Title: String { return self._s[1517]! } + public var CheckoutInfo_ShippingInfoPostcodePlaceholder: String { return self._s[1518]! } + public var InfoPlist_NSPhotoLibraryUsageDescription: String { return self._s[1519]! } + public var Wallpaper_Wallpaper: String { return self._s[1520]! } + public var GroupInfo_InviteLink_RevokeAlert_Revoke: String { return self._s[1521]! } + public var SharedMedia_TitleLink: String { return self._s[1523]! } public func Channel_AdminLog_MessageRestrictedName(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1514]!, self._r[1514]!, [_1]) + return formatWithArgumentRanges(self._s[1525]!, self._r[1525]!, [_1]) } public func Channel_AdminLog_MessageGroupPreHistoryHidden(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1515]!, self._r[1515]!, [_0]) + return formatWithArgumentRanges(self._s[1526]!, self._r[1526]!, [_0]) } - public var Channel_JoinChannel: String { return self._s[1516]! } - public var StickerPack_Add: String { return self._s[1517]! } - public var Group_ErrorNotMutualContact: String { return self._s[1519]! } - public var AccessDenied_LocationDisabled: String { return self._s[1522]! } - public var Login_UnknownError: String { return self._s[1523]! } - public var Presence_online: String { return self._s[1524]! } - public var DialogList_Title: String { return self._s[1526]! } - public var Stickers_Install: String { return self._s[1529]! } - public var SearchImages_NoImagesFound: String { return self._s[1532]! } + public var Channel_JoinChannel: String { return self._s[1527]! } + public var StickerPack_Add: String { return self._s[1528]! } + public var Group_ErrorNotMutualContact: String { return self._s[1530]! } + public var AccessDenied_LocationDisabled: String { return self._s[1533]! } + public var Login_UnknownError: String { return self._s[1534]! } + public var Presence_online: String { return self._s[1535]! } + public var DialogList_Title: String { return self._s[1537]! } + public var Stickers_Install: String { return self._s[1540]! } + public var SearchImages_NoImagesFound: String { return self._s[1543]! } public func Watch_Time_ShortTodayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1534]!, self._r[1534]!, [_0]) + return formatWithArgumentRanges(self._s[1545]!, self._r[1545]!, [_0]) } - public var Channel_AdminLogFilter_EventsNewSubscribers: String { return self._s[1535]! } - public var Passport_Identity_ExpiryDate: String { return self._s[1536]! } - public var UserInfo_GroupsInCommon: String { return self._s[1537]! } - public var Message_PinnedContactMessage: String { return self._s[1538]! } - public var AccessDenied_CameraDisabled: String { return self._s[1539]! } + public var Channel_AdminLogFilter_EventsNewSubscribers: String { return self._s[1546]! } + public var Passport_Identity_ExpiryDate: String { return self._s[1547]! } + public var UserInfo_GroupsInCommon: String { return self._s[1548]! } + public var Message_PinnedContactMessage: String { return self._s[1549]! } + public var AccessDenied_CameraDisabled: String { return self._s[1550]! } public func Time_PreciseDate_m3(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1540]!, self._r[1540]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1551]!, self._r[1551]!, [_1, _2, _3]) } - public var Passport_Email_EnterOtherEmail: String { return self._s[1541]! } + public var Passport_Email_EnterOtherEmail: String { return self._s[1552]! } public func LiveLocationUpdated_YesterdayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1542]!, self._r[1542]!, [_0]) + return formatWithArgumentRanges(self._s[1553]!, self._r[1553]!, [_0]) } - public var NotificationsSound_Note: String { return self._s[1544]! } - public var Passport_Identity_MiddleNamePlaceholder: String { return self._s[1546]! } - public var PrivacyPolicy_Title: String { return self._s[1549]! } - public var Month_GenMarch: String { return self._s[1550]! } - public var Watch_UserInfo_Unmute: String { return self._s[1551]! } - public var CheckoutInfo_ErrorPostcodeInvalid: String { return self._s[1552]! } - public var Common_Delete: String { return self._s[1553]! } - public var Username_Title: String { return self._s[1554]! } - public var Login_PhoneFloodError: String { return self._s[1555]! } - public var Channel_AdminLog_InfoPanelTitle: String { return self._s[1556]! } + public var NotificationsSound_Note: String { return self._s[1555]! } + public var Passport_Identity_MiddleNamePlaceholder: String { return self._s[1557]! } + public var PrivacyPolicy_Title: String { return self._s[1560]! } + public var Month_GenMarch: String { return self._s[1561]! } + public var Watch_UserInfo_Unmute: String { return self._s[1562]! } + public var CheckoutInfo_ErrorPostcodeInvalid: String { return self._s[1563]! } + public var Common_Delete: String { return self._s[1564]! } + public var Username_Title: String { return self._s[1565]! } + public var Login_PhoneFloodError: String { return self._s[1566]! } + public var Channel_AdminLog_InfoPanelTitle: String { return self._s[1567]! } public func CHANNEL_MESSAGE_PHOTO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1557]!, self._r[1557]!, [_1]) + return formatWithArgumentRanges(self._s[1568]!, self._r[1568]!, [_1]) } public func Channel_AdminLog_MessageToggleInvitesOff(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1558]!, self._r[1558]!, [_0]) + return formatWithArgumentRanges(self._s[1569]!, self._r[1569]!, [_0]) } - public var Group_ErrorAddTooMuchBots: String { return self._s[1559]! } + public var Group_ErrorAddTooMuchBots: String { return self._s[1570]! } public func Notification_CallFormat(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1560]!, self._r[1560]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1571]!, self._r[1571]!, [_1, _2]) } public func CHAT_MESSAGE_PHOTO(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1561]!, self._r[1561]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1572]!, self._r[1572]!, [_1, _2]) } public func UserInfo_UnblockConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1563]!, self._r[1563]!, [_0]) + return formatWithArgumentRanges(self._s[1574]!, self._r[1574]!, [_0]) } - public var Appearance_PickAccentColor: String { return self._s[1564]! } - public var Passport_Identity_EditDriversLicense: String { return self._s[1565]! } - public var Passport_Identity_AddPassport: String { return self._s[1566]! } - public var UserInfo_ShareBot: String { return self._s[1567]! } - public var Settings_ProxyConnected: String { return self._s[1568]! } - public var TwoStepAuth_RecoveryEmailAddDescription: String { return self._s[1569]! } - public var ChatSettings_AutoDownloadVoiceMessages: String { return self._s[1570]! } - public var TwoStepAuth_EmailSkip: String { return self._s[1572]! } - public var Conversation_ViewContactDetails: String { return self._s[1573]! } - public var Notifications_Badge_CountUnreadMessages_InfoOff: String { return self._s[1574]! } - public var Conversation_JumpToDate: String { return self._s[1575]! } - public var AutoDownloadSettings_VideoMessagesTitle: String { return self._s[1576]! } - public var Passport_Address_OneOfTypeUtilityBill: String { return self._s[1578]! } - public var CheckoutInfo_ReceiverInfoEmailPlaceholder: String { return self._s[1579]! } - public var Message_Photo: String { return self._s[1581]! } - public var Conversation_ReportSpam: String { return self._s[1582]! } - public var Camera_FlashAuto: String { return self._s[1583]! } - public var Passport_Identity_TypePassportUploadScan: String { return self._s[1585]! } - public var Call_ConnectionErrorMessage: String { return self._s[1586]! } - public var Stickers_FrequentlyUsed: String { return self._s[1587]! } - public var LastSeen_ALongTimeAgo: String { return self._s[1589]! } - public var Passport_Identity_ReverseSide: String { return self._s[1590]! } - public var DialogList_SearchSectionGlobal: String { return self._s[1591]! } - public var ChangePhoneNumberNumber_NumberPlaceholder: String { return self._s[1592]! } - public var GroupInfo_AddUserLeftError: String { return self._s[1593]! } - public var Appearance_ThemeDay: String { return self._s[1594]! } - public var GroupInfo_GroupType: String { return self._s[1595]! } - public var Watch_Suggestion_OnMyWay: String { return self._s[1596]! } - public var Checkout_NewCard_PaymentCard: String { return self._s[1597]! } + public var Appearance_PickAccentColor: String { return self._s[1575]! } + public var Passport_Identity_EditDriversLicense: String { return self._s[1576]! } + public var Passport_Identity_AddPassport: String { return self._s[1577]! } + public var UserInfo_ShareBot: String { return self._s[1578]! } + public var Settings_ProxyConnected: String { return self._s[1579]! } + public var TwoStepAuth_RecoveryEmailAddDescription: String { return self._s[1580]! } + public var ChatSettings_AutoDownloadVoiceMessages: String { return self._s[1581]! } + public var TwoStepAuth_EmailSkip: String { return self._s[1583]! } + public var Conversation_ViewContactDetails: String { return self._s[1584]! } + public var Notifications_Badge_CountUnreadMessages_InfoOff: String { return self._s[1585]! } + public var Conversation_JumpToDate: String { return self._s[1586]! } + public var AutoDownloadSettings_VideoMessagesTitle: String { return self._s[1587]! } + public var Passport_Address_OneOfTypeUtilityBill: String { return self._s[1589]! } + public var CheckoutInfo_ReceiverInfoEmailPlaceholder: String { return self._s[1590]! } + public var Message_Photo: String { return self._s[1592]! } + public var Conversation_ReportSpam: String { return self._s[1593]! } + public var Camera_FlashAuto: String { return self._s[1594]! } + public var Passport_Identity_TypePassportUploadScan: String { return self._s[1596]! } + public var Call_ConnectionErrorMessage: String { return self._s[1597]! } + public var Stickers_FrequentlyUsed: String { return self._s[1598]! } + public var LastSeen_ALongTimeAgo: String { return self._s[1600]! } + public var Passport_Identity_ReverseSide: String { return self._s[1601]! } + public var DialogList_SearchSectionGlobal: String { return self._s[1602]! } + public var ChangePhoneNumberNumber_NumberPlaceholder: String { return self._s[1603]! } + public var GroupInfo_AddUserLeftError: String { return self._s[1604]! } + public var Appearance_ThemeDay: String { return self._s[1605]! } + public var GroupInfo_GroupType: String { return self._s[1606]! } + public var Watch_Suggestion_OnMyWay: String { return self._s[1607]! } + public var Checkout_NewCard_PaymentCard: String { return self._s[1608]! } public func DialogList_SearchSubtitleFormat(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1598]!, self._r[1598]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1609]!, self._r[1609]!, [_1, _2]) } - public var PhotoEditor_CropAspectRatioOriginal: String { return self._s[1599]! } + public var PhotoEditor_CropAspectRatioOriginal: String { return self._s[1610]! } public func Conversation_RestrictedInlineTimed(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1600]!, self._r[1600]!, [_0]) + return formatWithArgumentRanges(self._s[1611]!, self._r[1611]!, [_0]) } - public var UserInfo_NotificationsDisabled: String { return self._s[1601]! } + public var UserInfo_NotificationsDisabled: String { return self._s[1612]! } public func CONTACT_JOINED(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1602]!, self._r[1602]!, [_1]) + return formatWithArgumentRanges(self._s[1613]!, self._r[1613]!, [_1]) } - public var NotificationsSound_Bamboo: String { return self._s[1604]! } - public var PrivacyLastSeenSettings_AlwaysShareWith_Title: String { return self._s[1605]! } + public var NotificationsSound_Bamboo: String { return self._s[1615]! } + public var PrivacyLastSeenSettings_AlwaysShareWith_Title: String { return self._s[1616]! } public func Channel_AdminLog_MessageGroupPreHistoryVisible(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1606]!, self._r[1606]!, [_0]) + return formatWithArgumentRanges(self._s[1617]!, self._r[1617]!, [_0]) } - public var BlockedUsers_LeavePrefix: String { return self._s[1608]! } - public var NetworkUsageSettings_ResetStatsConfirmation: String { return self._s[1609]! } - public var Group_Setup_HistoryHeader: String { return self._s[1610]! } - public var Channel_EditAdmin_PermissionPostMessages: String { return self._s[1613]! } + public var BlockedUsers_LeavePrefix: String { return self._s[1619]! } + public var NetworkUsageSettings_ResetStatsConfirmation: String { return self._s[1620]! } + public var Group_Setup_HistoryHeader: String { return self._s[1621]! } + public var Channel_EditAdmin_PermissionPostMessages: String { return self._s[1624]! } public func Contacts_AddPhoneNumber(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1614]!, self._r[1614]!, [_0]) + return formatWithArgumentRanges(self._s[1625]!, self._r[1625]!, [_0]) } public func MESSAGE_SCREENSHOT(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1615]!, self._r[1615]!, [_1]) + return formatWithArgumentRanges(self._s[1626]!, self._r[1626]!, [_1]) } - public var DialogList_EncryptionProcessing: String { return self._s[1616]! } - public var GroupInfo_GroupHistory: String { return self._s[1618]! } - public var Conversation_ApplyLocalization: String { return self._s[1619]! } - public var FastTwoStepSetup_Title: String { return self._s[1620]! } - public var SocksProxySetup_ProxyStatusUnavailable: String { return self._s[1621]! } - public var Passport_Address_EditRentalAgreement: String { return self._s[1622]! } - public var Conversation_DeleteManyMessages: String { return self._s[1624]! } - public var CancelResetAccount_Title: String { return self._s[1625]! } - public var Notification_CallOutgoingShort: String { return self._s[1626]! } - public var SharedMedia_TitleAll: String { return self._s[1628]! } - public var Conversation_SlideToCancel: String { return self._s[1629]! } - public var AuthSessions_TerminateSession: String { return self._s[1630]! } - public var Channel_AdminLogFilter_EventsDeletedMessages: String { return self._s[1631]! } - public var PrivacyLastSeenSettings_AlwaysShareWith_Placeholder: String { return self._s[1632]! } - public var Channel_Members_Title: String { return self._s[1633]! } - public var Channel_AdminLog_CanDeleteMessages: String { return self._s[1634]! } - public var Privacy_DeleteDrafts: String { return self._s[1635]! } - public var Group_Setup_TypePrivateHelp: String { return self._s[1636]! } + public var DialogList_EncryptionProcessing: String { return self._s[1627]! } + public var GroupInfo_GroupHistory: String { return self._s[1629]! } + public var Conversation_ApplyLocalization: String { return self._s[1630]! } + public var FastTwoStepSetup_Title: String { return self._s[1631]! } + public var SocksProxySetup_ProxyStatusUnavailable: String { return self._s[1632]! } + public var Passport_Address_EditRentalAgreement: String { return self._s[1633]! } + public var Conversation_DeleteManyMessages: String { return self._s[1635]! } + public var CancelResetAccount_Title: String { return self._s[1636]! } + public var Permissions_ContactsAllow: String { return self._s[1637]! } + public var Notification_CallOutgoingShort: String { return self._s[1638]! } + public var SharedMedia_TitleAll: String { return self._s[1640]! } + public var Conversation_SlideToCancel: String { return self._s[1641]! } + public var AuthSessions_TerminateSession: String { return self._s[1642]! } + public var Channel_AdminLogFilter_EventsDeletedMessages: String { return self._s[1643]! } + public var PrivacyLastSeenSettings_AlwaysShareWith_Placeholder: String { return self._s[1644]! } + public var Channel_Members_Title: String { return self._s[1645]! } + public var Channel_AdminLog_CanDeleteMessages: String { return self._s[1646]! } + public var Privacy_DeleteDrafts: String { return self._s[1647]! } + public var Group_Setup_TypePrivateHelp: String { return self._s[1648]! } public func Notification_PinnedVideoMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1637]!, self._r[1637]!, [_0]) + return formatWithArgumentRanges(self._s[1649]!, self._r[1649]!, [_0]) } - public var Conversation_ContextMenuStickerPackAdd: String { return self._s[1638]! } - public var Channel_AdminLogFilter_EventsNewMembers: String { return self._s[1639]! } - public var Channel_AdminLogFilter_EventsPinned: String { return self._s[1641]! } + public var Conversation_ContextMenuStickerPackAdd: String { return self._s[1650]! } + public var Channel_AdminLogFilter_EventsNewMembers: String { return self._s[1651]! } + public var Channel_AdminLogFilter_EventsPinned: String { return self._s[1653]! } public func Conversation_Moderate_DeleteAllMessages(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1643]!, self._r[1643]!, [_0]) + return formatWithArgumentRanges(self._s[1655]!, self._r[1655]!, [_0]) } - public var SharedMedia_CategoryOther: String { return self._s[1644]! } - public var Passport_Address_Address: String { return self._s[1645]! } - public var DialogList_SavedMessagesTooltip: String { return self._s[1646]! } - public var Preview_DeletePhoto: String { return self._s[1649]! } - public var GroupInfo_ChannelListNamePlaceholder: String { return self._s[1650]! } - public var PasscodeSettings_TurnPasscodeOn: String { return self._s[1651]! } - public var AuthSessions_LogOutApplicationsHelp: String { return self._s[1652]! } - public var Notification_Exceptions_AddException: String { return self._s[1654]! } - public var Passport_FieldOneOf_Delimeter: String { return self._s[1655]! } + public var SharedMedia_CategoryOther: String { return self._s[1656]! } + public var Passport_Address_Address: String { return self._s[1657]! } + public var DialogList_SavedMessagesTooltip: String { return self._s[1658]! } + public var Preview_DeletePhoto: String { return self._s[1661]! } + public var GroupInfo_ChannelListNamePlaceholder: String { return self._s[1662]! } + public var PasscodeSettings_TurnPasscodeOn: String { return self._s[1663]! } + public var AuthSessions_LogOutApplicationsHelp: String { return self._s[1664]! } + public var Notification_Exceptions_AddException: String { return self._s[1666]! } + public var Passport_FieldOneOf_Delimeter: String { return self._s[1667]! } public func Channel_AdminLog_MessageChangedGroupStickerPack(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1656]!, self._r[1656]!, [_0]) + return formatWithArgumentRanges(self._s[1668]!, self._r[1668]!, [_0]) } - public var DialogList_Unpin: String { return self._s[1657]! } - public var GroupInfo_SetGroupPhoto: String { return self._s[1659]! } - public var StickerPacksSettings_ArchivedPacks_Info: String { return self._s[1660]! } - public var ConvertToSupergroup_Title: String { return self._s[1662]! } + public var DialogList_Unpin: String { return self._s[1669]! } + public var GroupInfo_SetGroupPhoto: String { return self._s[1671]! } + public var StickerPacksSettings_ArchivedPacks_Info: String { return self._s[1672]! } + public var ConvertToSupergroup_Title: String { return self._s[1674]! } public func CHAT_MESSAGE_NOTEXT(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1663]!, self._r[1663]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1675]!, self._r[1675]!, [_1, _2]) } - public var Notification_CallCanceledShort: String { return self._s[1664]! } - public var Channel_Setup_TypeHeader: String { return self._s[1665]! } + public var Notification_CallCanceledShort: String { return self._s[1676]! } + public var Channel_Setup_TypeHeader: String { return self._s[1677]! } public func Notification_NewAuthDetected(_ _1: String, _ _2: String, _ _3: String, _ _4: String, _ _5: String, _ _6: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1666]!, self._r[1666]!, [_1, _2, _3, _4, _5, _6]) + return formatWithArgumentRanges(self._s[1678]!, self._r[1678]!, [_1, _2, _3, _4, _5, _6]) } public func Channel_AdminLog_MessageRemovedGroupStickerPack(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1667]!, self._r[1667]!, [_0]) + return formatWithArgumentRanges(self._s[1679]!, self._r[1679]!, [_0]) } - public var PrivacyPolicy_DeclineTitle: String { return self._s[1670]! } - public var AccessDenied_VideoMessageCamera: String { return self._s[1671]! } - public var Privacy_ContactsSyncHelp: String { return self._s[1672]! } - public var Conversation_Search: String { return self._s[1674]! } + public var PrivacyPolicy_DeclineTitle: String { return self._s[1682]! } + public var AccessDenied_VideoMessageCamera: String { return self._s[1683]! } + public var Privacy_ContactsSyncHelp: String { return self._s[1684]! } + public var Conversation_Search: String { return self._s[1686]! } public func Channel_Management_PromotedBy(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1675]!, self._r[1675]!, [_0]) + return formatWithArgumentRanges(self._s[1687]!, self._r[1687]!, [_0]) } public func PrivacySettings_LastSeenNobodyPlus(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1676]!, self._r[1676]!, [_0]) + return formatWithArgumentRanges(self._s[1688]!, self._r[1688]!, [_0]) } public func Time_MonthOfYear_m4(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1677]!, self._r[1677]!, [_0]) - } - public var SecretImage_Title: String { return self._s[1678]! } - public var Notifications_InAppNotificationsSounds: String { return self._s[1679]! } - public var Call_StatusRequesting: String { return self._s[1680]! } - public func Channel_AdminLog_MessageRestrictedUntil(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1681]!, self._r[1681]!, [_0]) - } - public func CHAT_MESSAGE_CONTACT(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1682]!, self._r[1682]!, [_1, _2]) - } - public var SocksProxySetup_UseProxy: String { return self._s[1683]! } - public var Group_UpgradeNoticeText1: String { return self._s[1684]! } - public var ChatSettings_Other: String { return self._s[1685]! } - public func Channel_AdminLog_MessageChangedChannelAbout(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1686]!, self._r[1686]!, [_0]) - } - public var Channel_Stickers_CreateYourOwn: String { return self._s[1687]! } - public func Call_EmojiDescription(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[1689]!, self._r[1689]!, [_0]) } - public var Settings_SaveIncomingPhotos: String { return self._s[1690]! } - public var TwoStepAuth_EnterEmailCode: String { return self._s[1691]! } + public var SecretImage_Title: String { return self._s[1690]! } + public var Notifications_InAppNotificationsSounds: String { return self._s[1691]! } + public var Call_StatusRequesting: String { return self._s[1692]! } + public func Channel_AdminLog_MessageRestrictedUntil(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[1693]!, self._r[1693]!, [_0]) + } + public func CHAT_MESSAGE_CONTACT(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[1694]!, self._r[1694]!, [_1, _2]) + } + public var SocksProxySetup_UseProxy: String { return self._s[1695]! } + public var Group_UpgradeNoticeText1: String { return self._s[1696]! } + public var ChatSettings_Other: String { return self._s[1697]! } + public func Channel_AdminLog_MessageChangedChannelAbout(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[1698]!, self._r[1698]!, [_0]) + } + public var Channel_Stickers_CreateYourOwn: String { return self._s[1699]! } + public func Call_EmojiDescription(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[1701]!, self._r[1701]!, [_0]) + } + public var Settings_SaveIncomingPhotos: String { return self._s[1702]! } + public var TwoStepAuth_EnterEmailCode: String { return self._s[1703]! } public func Conversation_Bytes(_ _0: Int) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1692]!, self._r[1692]!, ["\(_0)"]) + return formatWithArgumentRanges(self._s[1704]!, self._r[1704]!, ["\(_0)"]) } - public var GroupInfo_InviteLink_Help: String { return self._s[1693]! } - public var Calls_Missed: String { return self._s[1694]! } - public var Conversation_ContextMenuForward: String { return self._s[1697]! } - public var AutoDownloadSettings_ResetHelp: String { return self._s[1698]! } - public var Passport_Identity_NativeNameHelp: String { return self._s[1699]! } - public var Call_StatusRinging: String { return self._s[1700]! } - public var Passport_Language_pl: String { return self._s[1701]! } - public var Invitation_JoinGroup: String { return self._s[1702]! } - public var Notification_PinnedMessage: String { return self._s[1703]! } - public var AutoDownloadSettings_WiFi: String { return self._s[1705]! } - public var Conversation_ClearSelfHistory: String { return self._s[1706]! } - public var Message_Location: String { return self._s[1707]! } + public var GroupInfo_InviteLink_Help: String { return self._s[1705]! } + public var Calls_Missed: String { return self._s[1706]! } + public var Conversation_ContextMenuForward: String { return self._s[1709]! } + public var AutoDownloadSettings_ResetHelp: String { return self._s[1710]! } + public var Passport_Identity_NativeNameHelp: String { return self._s[1711]! } + public var Call_StatusRinging: String { return self._s[1712]! } + public var Passport_Language_pl: String { return self._s[1713]! } + public var Invitation_JoinGroup: String { return self._s[1714]! } + public var Notification_PinnedMessage: String { return self._s[1715]! } + public var AutoDownloadSettings_WiFi: String { return self._s[1717]! } + public var Conversation_ClearSelfHistory: String { return self._s[1718]! } + public var Message_Location: String { return self._s[1719]! } public func Notification_MessageLifetimeChanged(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1708]!, self._r[1708]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1720]!, self._r[1720]!, [_1, _2]) } - public var Message_Contact: String { return self._s[1709]! } - public var Passport_Language_lo: String { return self._s[1711]! } - public var UserInfo_BotPrivacy: String { return self._s[1712]! } - public var PasscodeSettings_AutoLock_IfAwayFor_1minute: String { return self._s[1713]! } - public var Common_More: String { return self._s[1716]! } - public var Preview_OpenInInstagram: String { return self._s[1717]! } - public var PhotoEditor_HighlightsTool: String { return self._s[1720]! } + public var Message_Contact: String { return self._s[1721]! } + public var Passport_Language_lo: String { return self._s[1723]! } + public var UserInfo_BotPrivacy: String { return self._s[1724]! } + public var PasscodeSettings_AutoLock_IfAwayFor_1minute: String { return self._s[1725]! } + public var Common_More: String { return self._s[1728]! } + public var Preview_OpenInInstagram: String { return self._s[1729]! } + public var PhotoEditor_HighlightsTool: String { return self._s[1732]! } public func Channel_Username_UsernameIsAvailable(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1721]!, self._r[1721]!, [_0]) + return formatWithArgumentRanges(self._s[1733]!, self._r[1733]!, [_0]) } public func PINNED_GAME(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1722]!, self._r[1722]!, [_1]) + return formatWithArgumentRanges(self._s[1734]!, self._r[1734]!, [_1]) } - public var Invite_LargeRecipientsCountWarning: String { return self._s[1723]! } - public var Passport_Language_hr: String { return self._s[1724]! } - public var GroupInfo_BroadcastListNamePlaceholder: String { return self._s[1725]! } - public var Activity_UploadingVideoMessage: String { return self._s[1726]! } - public var Conversation_ShareBotContactConfirmation: String { return self._s[1727]! } - public var Login_CodeSentSms: String { return self._s[1730]! } + public var Invite_LargeRecipientsCountWarning: String { return self._s[1735]! } + public var Passport_Language_hr: String { return self._s[1736]! } + public var GroupInfo_BroadcastListNamePlaceholder: String { return self._s[1737]! } + public var Activity_UploadingVideoMessage: String { return self._s[1738]! } + public var Conversation_ShareBotContactConfirmation: String { return self._s[1739]! } + public var Login_CodeSentSms: String { return self._s[1742]! } public func CHANNEL_MESSAGES(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1731]!, self._r[1731]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1743]!, self._r[1743]!, [_1, _2]) } - public var Conversation_ReportSpamConfirmation: String { return self._s[1732]! } - public var ChannelMembers_ChannelAdminsTitle: String { return self._s[1733]! } - public var SocksProxySetup_Credentials: String { return self._s[1734]! } - public var CallSettings_UseLessData: String { return self._s[1735]! } - public var MediaPicker_GroupDescription: String { return self._s[1736]! } - public var Conversation_SendMessageErrorGroupRestricted: String { return self._s[1737]! } + public var Conversation_ReportSpamConfirmation: String { return self._s[1744]! } + public var ChannelMembers_ChannelAdminsTitle: String { return self._s[1745]! } + public var SocksProxySetup_Credentials: String { return self._s[1746]! } + public var CallSettings_UseLessData: String { return self._s[1747]! } + public var MediaPicker_GroupDescription: String { return self._s[1748]! } + public var Conversation_SendMessageErrorGroupRestricted: String { return self._s[1749]! } public func TwoStepAuth_EnterPasswordHint(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1738]!, self._r[1738]!, [_0]) + return formatWithArgumentRanges(self._s[1750]!, self._r[1750]!, [_0]) } - public var CallSettings_TabIcon: String { return self._s[1739]! } - public var ConversationProfile_UnknownAddMemberError: String { return self._s[1741]! } + public var CallSettings_TabIcon: String { return self._s[1751]! } + public var ConversationProfile_UnknownAddMemberError: String { return self._s[1753]! } public func Conversation_FileHowToText(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1744]!, self._r[1744]!, [_0]) + return formatWithArgumentRanges(self._s[1756]!, self._r[1756]!, [_0]) } - public var Channel_AdminLog_BanSendMedia: String { return self._s[1745]! } - public var Passport_Language_uz: String { return self._s[1746]! } - public var Watch_UserInfo_Unblock: String { return self._s[1747]! } - public var ChatSettings_AutoDownloadVideoMessages: String { return self._s[1749]! } - public var PrivacyPolicy_AgeVerificationTitle: String { return self._s[1750]! } - public var StickerPacksSettings_ArchivedMasks: String { return self._s[1752]! } - public var Message_Animation: String { return self._s[1754]! } - public var Checkout_PaymentMethod: String { return self._s[1755]! } - public var Channel_AdminLog_TitleSelectedEvents: String { return self._s[1756]! } - public var PrivacyPolicy_DeclineDeleteNow: String { return self._s[1757]! } - public var Privacy_Calls_NeverAllow_Title: String { return self._s[1758]! } - public var Cache_Music: String { return self._s[1759]! } - public var Settings_ProxyDisabled: String { return self._s[1763]! } - public var SocksProxySetup_Connecting: String { return self._s[1764]! } - public var Channel_Username_CreatePrivateLinkHelp: String { return self._s[1765]! } + public var Channel_AdminLog_BanSendMedia: String { return self._s[1757]! } + public var Passport_Language_uz: String { return self._s[1758]! } + public var Watch_UserInfo_Unblock: String { return self._s[1759]! } + public var ChatSettings_AutoDownloadVideoMessages: String { return self._s[1761]! } + public var PrivacyPolicy_AgeVerificationTitle: String { return self._s[1762]! } + public var StickerPacksSettings_ArchivedMasks: String { return self._s[1764]! } + public var Message_Animation: String { return self._s[1766]! } + public var Checkout_PaymentMethod: String { return self._s[1767]! } + public var Channel_AdminLog_TitleSelectedEvents: String { return self._s[1768]! } + public var PrivacyPolicy_DeclineDeleteNow: String { return self._s[1769]! } + public var Privacy_Calls_NeverAllow_Title: String { return self._s[1770]! } + public var Cache_Music: String { return self._s[1771]! } + public var Settings_ProxyDisabled: String { return self._s[1775]! } + public var SocksProxySetup_Connecting: String { return self._s[1776]! } + public var Channel_Username_CreatePrivateLinkHelp: String { return self._s[1777]! } public func Time_PreciseDate_m2(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1766]!, self._r[1766]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1778]!, self._r[1778]!, [_1, _2, _3]) } public func FileSize_B(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1768]!, self._r[1768]!, [_0]) - } - public func Target_ShareGameConfirmationGroup(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1771]!, self._r[1771]!, [_0]) - } - public var PhotoEditor_SaturationTool: String { return self._s[1773]! } - public var Channel_BanUser_BlockFor: String { return self._s[1774]! } - public var Call_StatusConnecting: String { return self._s[1775]! } - public var AutoNightTheme_NotAvailable: String { return self._s[1776]! } - public var PrivateDataSettings_Title: String { return self._s[1777]! } - public var Bot_Start: String { return self._s[1779]! } - public func Channel_AdminLog_MessageChangedGroupAbout(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[1780]!, self._r[1780]!, [_0]) } - public var Appearance_PreviewReplyAuthor: String { return self._s[1781]! } - public var Notifications_TextTone: String { return self._s[1782]! } - public var Settings_CallSettings: String { return self._s[1783]! } + public func Target_ShareGameConfirmationGroup(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[1783]!, self._r[1783]!, [_0]) + } + public var PhotoEditor_SaturationTool: String { return self._s[1785]! } + public var Channel_BanUser_BlockFor: String { return self._s[1786]! } + public var Call_StatusConnecting: String { return self._s[1787]! } + public var AutoNightTheme_NotAvailable: String { return self._s[1788]! } + public var PrivateDataSettings_Title: String { return self._s[1789]! } + public var Bot_Start: String { return self._s[1791]! } + public func Channel_AdminLog_MessageChangedGroupAbout(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[1792]!, self._r[1792]!, [_0]) + } + public var Appearance_PreviewReplyAuthor: String { return self._s[1793]! } + public var Notifications_TextTone: String { return self._s[1794]! } + public var Settings_CallSettings: String { return self._s[1795]! } public func Watch_Time_ShortYesterdayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1784]!, self._r[1784]!, [_0]) + return formatWithArgumentRanges(self._s[1796]!, self._r[1796]!, [_0]) } - public var Contacts_InviteToTelegram: String { return self._s[1785]! } + public var Contacts_InviteToTelegram: String { return self._s[1797]! } public func PINNED_DOC(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1786]!, self._r[1786]!, [_1]) + return formatWithArgumentRanges(self._s[1798]!, self._r[1798]!, [_1]) } - public var ChatSettings_PrivateChats: String { return self._s[1787]! } - public var DialogList_Draft: String { return self._s[1788]! } - public var Channel_EditAdmin_PermissionDeleteMessages: String { return self._s[1789]! } - public var Channel_BanUser_PermissionSendStickersAndGifs: String { return self._s[1790]! } - public var Conversation_CloudStorageInfo_Title: String { return self._s[1791]! } - public var Conversation_ClearSecretHistory: String { return self._s[1792]! } - public var Passport_Identity_EditIdentityCard: String { return self._s[1793]! } - public var Notification_RenamedChannel: String { return self._s[1794]! } - public var BlockedUsers_BlockUser: String { return self._s[1795]! } - public var ChatSettings_TextSize: String { return self._s[1796]! } - public var ChannelInfo_DeleteGroup: String { return self._s[1797]! } - public var PhoneNumberHelp_Alert: String { return self._s[1798]! } + public var ChatSettings_PrivateChats: String { return self._s[1799]! } + public var DialogList_Draft: String { return self._s[1800]! } + public var Channel_EditAdmin_PermissionDeleteMessages: String { return self._s[1801]! } + public var Channel_BanUser_PermissionSendStickersAndGifs: String { return self._s[1802]! } + public var Conversation_CloudStorageInfo_Title: String { return self._s[1803]! } + public var Conversation_ClearSecretHistory: String { return self._s[1804]! } + public var Passport_Identity_EditIdentityCard: String { return self._s[1805]! } + public var Notification_RenamedChannel: String { return self._s[1806]! } + public var BlockedUsers_BlockUser: String { return self._s[1807]! } + public var ChatSettings_TextSize: String { return self._s[1808]! } + public var ChannelInfo_DeleteGroup: String { return self._s[1809]! } + public var PhoneNumberHelp_Alert: String { return self._s[1810]! } public func PINNED_TEXT(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1799]!, self._r[1799]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1811]!, self._r[1811]!, [_1, _2]) } - public var Watch_ChannelInfo_Title: String { return self._s[1800]! } - public var WebSearch_RecentSectionClear: String { return self._s[1801]! } - public var Channel_AdminLogFilter_AdminsAll: String { return self._s[1802]! } - public var Channel_Setup_TypePrivate: String { return self._s[1803]! } - public var PhotoEditor_TintTool: String { return self._s[1804]! } - public var Watch_Suggestion_CantTalk: String { return self._s[1805]! } - public var PhotoEditor_QualityHigh: String { return self._s[1806]! } - public var SocksProxySetup_AddProxyTitle: String { return self._s[1808]! } + public var Watch_ChannelInfo_Title: String { return self._s[1812]! } + public var WebSearch_RecentSectionClear: String { return self._s[1813]! } + public var Channel_AdminLogFilter_AdminsAll: String { return self._s[1814]! } + public var Channel_Setup_TypePrivate: String { return self._s[1815]! } + public var PhotoEditor_TintTool: String { return self._s[1816]! } + public var Watch_Suggestion_CantTalk: String { return self._s[1817]! } + public var PhotoEditor_QualityHigh: String { return self._s[1818]! } + public var SocksProxySetup_AddProxyTitle: String { return self._s[1820]! } public func CHAT_MESSAGE_STICKER(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1810]!, self._r[1810]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1822]!, self._r[1822]!, [_1, _2, _3]) } - public var Map_ChooseAPlace: String { return self._s[1811]! } - public var Passport_Identity_NamePlaceholder: String { return self._s[1813]! } - public var Passport_ScanPassport: String { return self._s[1814]! } - public var ApplyLanguage_ChangeLanguageTitle: String { return self._s[1815]! } - public var Map_ShareLiveLocationHelp: String { return self._s[1816]! } - public var Watch_Bot_Restart: String { return self._s[1818]! } - public var Passport_RequestedInformation: String { return self._s[1819]! } - public var Channel_About_Help: String { return self._s[1820]! } - public var Web_OpenExternal: String { return self._s[1821]! } - public var Passport_Language_mn: String { return self._s[1822]! } - public var UserInfo_AddContact: String { return self._s[1824]! } - public var Privacy_ContactsSync: String { return self._s[1825]! } - public var SocksProxySetup_Connection: String { return self._s[1827]! } - public var Passport_NotLoggedInMessage: String { return self._s[1828]! } - public var Passport_PasswordPlaceholder: String { return self._s[1829]! } - public var Passport_PasswordCreate: String { return self._s[1830]! } - public var SocksProxySetup_ProxyStatusChecking: String { return self._s[1832]! } - public var Call_EncryptionKey_Title: String { return self._s[1833]! } - public var PhotoEditor_BlurToolLinear: String { return self._s[1835]! } - public var AuthSessions_EmptyText: String { return self._s[1836]! } - public var Notification_MessageLifetime1m: String { return self._s[1837]! } + public var Map_ChooseAPlace: String { return self._s[1823]! } + public var Passport_Identity_NamePlaceholder: String { return self._s[1825]! } + public var Passport_ScanPassport: String { return self._s[1826]! } + public var ApplyLanguage_ChangeLanguageTitle: String { return self._s[1827]! } + public var Map_ShareLiveLocationHelp: String { return self._s[1828]! } + public var Watch_Bot_Restart: String { return self._s[1830]! } + public var Passport_RequestedInformation: String { return self._s[1831]! } + public var Channel_About_Help: String { return self._s[1832]! } + public var Web_OpenExternal: String { return self._s[1833]! } + public var Passport_Language_mn: String { return self._s[1834]! } + public var UserInfo_AddContact: String { return self._s[1836]! } + public var Privacy_ContactsSync: String { return self._s[1837]! } + public var SocksProxySetup_Connection: String { return self._s[1839]! } + public var Passport_NotLoggedInMessage: String { return self._s[1840]! } + public var Passport_PasswordPlaceholder: String { return self._s[1841]! } + public var Passport_PasswordCreate: String { return self._s[1842]! } + public var SocksProxySetup_ProxyStatusChecking: String { return self._s[1844]! } + public var Call_EncryptionKey_Title: String { return self._s[1845]! } + public var PhotoEditor_BlurToolLinear: String { return self._s[1847]! } + public var AuthSessions_EmptyText: String { return self._s[1848]! } + public var Notification_MessageLifetime1m: String { return self._s[1849]! } public func Call_StatusBar(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1838]!, self._r[1838]!, [_0]) - } - public var EditProfile_NameAndPhotoHelp: String { return self._s[1839]! } - public var NotificationsSound_Tritone: String { return self._s[1840]! } - public var Passport_FieldAddressUploadHelp: String { return self._s[1841]! } - public var Month_ShortJuly: String { return self._s[1842]! } - public var CheckoutInfo_ShippingInfoAddress1Placeholder: String { return self._s[1843]! } - public var Watch_MessageView_ViewOnPhone: String { return self._s[1844]! } - public var CallSettings_Never: String { return self._s[1845]! } - public var Passport_Identity_TypeInternalPassportUploadScan: String { return self._s[1848]! } - public var TwoStepAuth_EmailSent: String { return self._s[1849]! } - public func Notification_PinnedAnimationMessage(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[1850]!, self._r[1850]!, [_0]) } - public var TwoStepAuth_RecoveryTitle: String { return self._s[1853]! } - public var Notifications_MessageNotificationsExceptions: String { return self._s[1854]! } - public var WatchRemote_AlertOpen: String { return self._s[1856]! } - public var ExplicitContent_AlertChannel: String { return self._s[1857]! } - public var Notification_PassportValueEmail: String { return self._s[1858]! } - public var ContactInfo_PhoneLabelMobile: String { return self._s[1860]! } - public var Widget_AuthRequired: String { return self._s[1862]! } + public var EditProfile_NameAndPhotoHelp: String { return self._s[1851]! } + public var NotificationsSound_Tritone: String { return self._s[1852]! } + public var Passport_FieldAddressUploadHelp: String { return self._s[1853]! } + public var Month_ShortJuly: String { return self._s[1854]! } + public var CheckoutInfo_ShippingInfoAddress1Placeholder: String { return self._s[1855]! } + public var Watch_MessageView_ViewOnPhone: String { return self._s[1856]! } + public var CallSettings_Never: String { return self._s[1857]! } + public var Passport_Identity_TypeInternalPassportUploadScan: String { return self._s[1860]! } + public var TwoStepAuth_EmailSent: String { return self._s[1861]! } + public func Notification_PinnedAnimationMessage(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[1862]!, self._r[1862]!, [_0]) + } + public var TwoStepAuth_RecoveryTitle: String { return self._s[1865]! } + public var Notifications_MessageNotificationsExceptions: String { return self._s[1866]! } + public var WatchRemote_AlertOpen: String { return self._s[1868]! } + public var ExplicitContent_AlertChannel: String { return self._s[1869]! } + public var Notification_PassportValueEmail: String { return self._s[1870]! } + public var ContactInfo_PhoneLabelMobile: String { return self._s[1872]! } + public var Widget_AuthRequired: String { return self._s[1874]! } public func ForwardedAuthors2(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1863]!, self._r[1863]!, [_0, _1]) + return formatWithArgumentRanges(self._s[1875]!, self._r[1875]!, [_0, _1]) } - public var ChannelInfo_DeleteGroupConfirmation: String { return self._s[1864]! } - public var TwoStepAuth_ConfirmationText: String { return self._s[1865]! } - public var Login_SmsRequestState3: String { return self._s[1866]! } - public var Notifications_AlertTones: String { return self._s[1867]! } + public var ChannelInfo_DeleteGroupConfirmation: String { return self._s[1876]! } + public var TwoStepAuth_ConfirmationText: String { return self._s[1877]! } + public var Login_SmsRequestState3: String { return self._s[1878]! } + public var Notifications_AlertTones: String { return self._s[1879]! } public func Time_MonthOfYear_m10(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1868]!, self._r[1868]!, [_0]) + return formatWithArgumentRanges(self._s[1880]!, self._r[1880]!, [_0]) } - public var Login_InfoAvatarPhoto: String { return self._s[1870]! } - public var Calls_TabTitle: String { return self._s[1873]! } - public var Map_YouAreHere: String { return self._s[1874]! } - public var PhotoEditor_CurvesTool: String { return self._s[1875]! } - public var Map_LiveLocationFor1Hour: String { return self._s[1876]! } - public var AutoNightTheme_AutomaticSection: String { return self._s[1877]! } - public var Stickers_NoStickersFound: String { return self._s[1878]! } - public var Passport_Identity_AddIdentityCard: String { return self._s[1880]! } + public var Login_InfoAvatarPhoto: String { return self._s[1882]! } + public var Calls_TabTitle: String { return self._s[1885]! } + public var Map_YouAreHere: String { return self._s[1886]! } + public var PhotoEditor_CurvesTool: String { return self._s[1887]! } + public var Map_LiveLocationFor1Hour: String { return self._s[1888]! } + public var AutoNightTheme_AutomaticSection: String { return self._s[1889]! } + public var Stickers_NoStickersFound: String { return self._s[1890]! } + public var Passport_Identity_AddIdentityCard: String { return self._s[1892]! } public func Notification_JoinedChannel(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1881]!, self._r[1881]!, [_0]) + return formatWithArgumentRanges(self._s[1893]!, self._r[1893]!, [_0]) } - public var Passport_Language_et: String { return self._s[1882]! } - public var Passport_Language_en: String { return self._s[1883]! } - public var Login_CancelPhoneVerification: String { return self._s[1884]! } - public var GroupInfo_ActionRestrict: String { return self._s[1887]! } - public var Checkout_ShippingOption_Title: String { return self._s[1888]! } - public var Stickers_SuggestStickers: String { return self._s[1890]! } + public var Passport_Language_et: String { return self._s[1894]! } + public var Passport_Language_en: String { return self._s[1895]! } + public var Login_CancelPhoneVerification: String { return self._s[1896]! } + public var GroupInfo_ActionRestrict: String { return self._s[1899]! } + public var Checkout_ShippingOption_Title: String { return self._s[1900]! } + public var Stickers_SuggestStickers: String { return self._s[1902]! } public func Channel_AdminLog_MessageKickedName(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1894]!, self._r[1894]!, [_1]) + return formatWithArgumentRanges(self._s[1906]!, self._r[1906]!, [_1]) } - public var Conversation_EncryptionProcessing: String { return self._s[1895]! } - public var TwoStepAuth_EmailCodeExpired: String { return self._s[1896]! } + public var Conversation_EncryptionProcessing: String { return self._s[1907]! } + public var TwoStepAuth_EmailCodeExpired: String { return self._s[1908]! } public func CHAT_ADD_MEMBER(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1899]!, self._r[1899]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1911]!, self._r[1911]!, [_1, _2, _3]) } - public var Weekday_ShortSunday: String { return self._s[1902]! } - public var Privacy_ContactsResetConfirmation: String { return self._s[1903]! } - public var Month_ShortJune: String { return self._s[1904]! } - public var Privacy_Calls_Integration: String { return self._s[1905]! } - public var Channel_TypeSetup_Title: String { return self._s[1906]! } - public var Month_GenApril: String { return self._s[1907]! } - public var StickerPacksSettings_ShowStickersButton: String { return self._s[1908]! } - public var CheckoutInfo_ShippingInfoTitle: String { return self._s[1909]! } - public var Notification_PassportValueProofOfAddress: String { return self._s[1910]! } - public var Weekday_Tuesday: String { return self._s[1911]! } - public var StickerPacksSettings_ShowStickersButtonHelp: String { return self._s[1912]! } + public var Weekday_ShortSunday: String { return self._s[1914]! } + public var Privacy_ContactsResetConfirmation: String { return self._s[1915]! } + public var Month_ShortJune: String { return self._s[1916]! } + public var Privacy_Calls_Integration: String { return self._s[1917]! } + public var Channel_TypeSetup_Title: String { return self._s[1918]! } + public var Month_GenApril: String { return self._s[1919]! } + public var StickerPacksSettings_ShowStickersButton: String { return self._s[1920]! } + public var CheckoutInfo_ShippingInfoTitle: String { return self._s[1921]! } + public var Notification_PassportValueProofOfAddress: String { return self._s[1922]! } + public var Weekday_Tuesday: String { return self._s[1923]! } + public var StickerPacksSettings_ShowStickersButtonHelp: String { return self._s[1924]! } public func Compatibility_SecretMediaVersionTooLow(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1913]!, self._r[1913]!, [_0, _1]) + return formatWithArgumentRanges(self._s[1925]!, self._r[1925]!, [_0, _1]) } - public var CallSettings_RecentCalls: String { return self._s[1914]! } + public var CallSettings_RecentCalls: String { return self._s[1926]! } public func Conversation_Megabytes(_ _0: Float) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1919]!, self._r[1919]!, ["\(_0)"]) + return formatWithArgumentRanges(self._s[1931]!, self._r[1931]!, ["\(_0)"]) } - public var Conversation_SearchByName_Prefix: String { return self._s[1922]! } - public var TwoStepAuth_FloodError: String { return self._s[1923]! } - public var Paint_Stickers: String { return self._s[1924]! } - public var Login_InvalidCountryCode: String { return self._s[1925]! } - public var Privacy_Calls_AlwaysAllow_Title: String { return self._s[1926]! } - public var Username_InvalidTooShort: String { return self._s[1927]! } + public var Conversation_SearchByName_Prefix: String { return self._s[1934]! } + public var Permissions_ContactsText: String { return self._s[1935]! } + public var TwoStepAuth_FloodError: String { return self._s[1936]! } + public var Paint_Stickers: String { return self._s[1937]! } + public var Login_InvalidCountryCode: String { return self._s[1938]! } + public var Privacy_Calls_AlwaysAllow_Title: String { return self._s[1939]! } + public var Username_InvalidTooShort: String { return self._s[1940]! } public func Settings_ApplyProxyAlert(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1928]!, self._r[1928]!, [_1, _2]) - } - public var Weekday_ShortFriday: String { return self._s[1929]! } - public func Login_BannedPhoneBody(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1930]!, self._r[1930]!, [_0]) - } - public var Conversation_ClearAll: String { return self._s[1931]! } - public var Conversation_EditingMessageMediaChange: String { return self._s[1932]! } - public var Passport_FieldIdentityTranslationHelp: String { return self._s[1933]! } - public var Call_ReportIncludeLog: String { return self._s[1934]! } - public func Time_MonthOfYear_m3(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1935]!, self._r[1935]!, [_0]) - } - public var SharedMedia_EmptyTitle: String { return self._s[1936]! } - public var Call_PhoneCallInProgressMessage: String { return self._s[1937]! } - public var Notification_GroupActivated: String { return self._s[1938]! } - public var Checkout_Name: String { return self._s[1939]! } - public var Passport_Address_PostcodePlaceholder: String { return self._s[1940]! } - public func AUTH_REGION(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[1941]!, self._r[1941]!, [_1, _2]) } - public var Settings_NotificationsAndSounds: String { return self._s[1942]! } - public var Conversation_EncryptionCanceled: String { return self._s[1943]! } + public var Weekday_ShortFriday: String { return self._s[1942]! } + public func Login_BannedPhoneBody(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[1943]!, self._r[1943]!, [_0]) + } + public var Conversation_ClearAll: String { return self._s[1944]! } + public var Conversation_EditingMessageMediaChange: String { return self._s[1945]! } + public var Passport_FieldIdentityTranslationHelp: String { return self._s[1946]! } + public var Call_ReportIncludeLog: String { return self._s[1947]! } + public func Time_MonthOfYear_m3(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[1948]!, self._r[1948]!, [_0]) + } + public var SharedMedia_EmptyTitle: String { return self._s[1949]! } + public var Call_PhoneCallInProgressMessage: String { return self._s[1950]! } + public var Notification_GroupActivated: String { return self._s[1951]! } + public var Checkout_Name: String { return self._s[1952]! } + public var Passport_Address_PostcodePlaceholder: String { return self._s[1953]! } + public func AUTH_REGION(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[1954]!, self._r[1954]!, [_1, _2]) + } + public var Settings_NotificationsAndSounds: String { return self._s[1955]! } + public var Conversation_EncryptionCanceled: String { return self._s[1956]! } public func GroupInfo_InvitationLinkAcceptChannel(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1944]!, self._r[1944]!, [_0]) + return formatWithArgumentRanges(self._s[1957]!, self._r[1957]!, [_0]) } - public var AccessDenied_SaveMedia: String { return self._s[1945]! } - public var InviteText_URL: String { return self._s[1946]! } - public var Passport_CorrectErrors: String { return self._s[1947]! } + public var AccessDenied_SaveMedia: String { return self._s[1958]! } + public var InviteText_URL: String { return self._s[1959]! } + public var Passport_CorrectErrors: String { return self._s[1960]! } public func Channel_AdminLog_MessageInvitedNameUsername(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1948]!, self._r[1948]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1961]!, self._r[1961]!, [_1, _2]) } - public var Notifications_Badge_CountUnreadMessages: String { return self._s[1949]! } - public var Appearance_ReduceMotion: String { return self._s[1950]! } - public var Compose_GroupTokenListPlaceholder: String { return self._s[1951]! } - public var Passport_Address_CityPlaceholder: String { return self._s[1952]! } - public var Passport_InfoFAQ_URL: String { return self._s[1953]! } - public var Conversation_MessageDeliveryFailed: String { return self._s[1956]! } - public var InstantPage_TapToOpenLink: String { return self._s[1957]! } - public var Privacy_PaymentsClear_PaymentInfo: String { return self._s[1958]! } - public var Notifications_GroupNotifications: String { return self._s[1959]! } - public var CheckoutInfo_SaveInfoHelp: String { return self._s[1960]! } - public var Notification_Mute1hMin: String { return self._s[1961]! } - public var Privacy_TopPeersWarning: String { return self._s[1962]! } - public var StickerPacksSettings_ArchivedMasks_Info: String { return self._s[1964]! } - public var ChannelMembers_WhoCanAddMembers_AllMembers: String { return self._s[1966]! } - public var Channel_Edit_PrivatePublicLinkAlert: String { return self._s[1967]! } - public var Watch_Conversation_UserInfo: String { return self._s[1968]! } - public var Application_Name: String { return self._s[1969]! } - public var Conversation_AddToReadingList: String { return self._s[1970]! } - public var Conversation_FileDropbox: String { return self._s[1971]! } - public var Login_PhonePlaceholder: String { return self._s[1972]! } - public var SocksProxySetup_ProxyEnabled: String { return self._s[1973]! } - public var Profile_MessageLifetime1d: String { return self._s[1974]! } - public var CheckoutInfo_ShippingInfoCityPlaceholder: String { return self._s[1975]! } - public var Notifications_ChannelNotificationsSound: String { return self._s[1976]! } - public var Calls_CallTabDescription: String { return self._s[1977]! } - public var Passport_DeletePersonalDetails: String { return self._s[1978]! } - public var Passport_Address_AddBankStatement: String { return self._s[1979]! } - public var Resolve_ErrorNotFound: String { return self._s[1980]! } - public var Watch_Message_Call: String { return self._s[1981]! } - public var PhotoEditor_FadeTool: String { return self._s[1982]! } - public var Channel_Setup_TypePublicHelp: String { return self._s[1984]! } - public var GroupInfo_InviteLink_RevokeAlert_Success: String { return self._s[1987]! } - public var Channel_Setup_PublicNoLink: String { return self._s[1988]! } - public var Privacy_Calls_P2PHelp: String { return self._s[1989]! } - public var Conversation_Info: String { return self._s[1990]! } + public var Notifications_Badge_CountUnreadMessages: String { return self._s[1962]! } + public var Appearance_ReduceMotion: String { return self._s[1963]! } + public var Compose_GroupTokenListPlaceholder: String { return self._s[1964]! } + public var Passport_Address_CityPlaceholder: String { return self._s[1965]! } + public var Passport_InfoFAQ_URL: String { return self._s[1966]! } + public var Conversation_MessageDeliveryFailed: String { return self._s[1969]! } + public var InstantPage_TapToOpenLink: String { return self._s[1970]! } + public var Privacy_PaymentsClear_PaymentInfo: String { return self._s[1971]! } + public var Notifications_GroupNotifications: String { return self._s[1972]! } + public var CheckoutInfo_SaveInfoHelp: String { return self._s[1973]! } + public var Notification_Mute1hMin: String { return self._s[1974]! } + public var Privacy_TopPeersWarning: String { return self._s[1975]! } + public var StickerPacksSettings_ArchivedMasks_Info: String { return self._s[1977]! } + public var ChannelMembers_WhoCanAddMembers_AllMembers: String { return self._s[1979]! } + public var Channel_Edit_PrivatePublicLinkAlert: String { return self._s[1980]! } + public var Watch_Conversation_UserInfo: String { return self._s[1981]! } + public var Application_Name: String { return self._s[1982]! } + public var Conversation_AddToReadingList: String { return self._s[1983]! } + public var Conversation_FileDropbox: String { return self._s[1984]! } + public var Login_PhonePlaceholder: String { return self._s[1985]! } + public var SocksProxySetup_ProxyEnabled: String { return self._s[1986]! } + public var Profile_MessageLifetime1d: String { return self._s[1987]! } + public var CheckoutInfo_ShippingInfoCityPlaceholder: String { return self._s[1988]! } + public var Notifications_ChannelNotificationsSound: String { return self._s[1989]! } + public var Calls_CallTabDescription: String { return self._s[1990]! } + public var Passport_DeletePersonalDetails: String { return self._s[1991]! } + public var Passport_Address_AddBankStatement: String { return self._s[1992]! } + public var Resolve_ErrorNotFound: String { return self._s[1993]! } + public var Watch_Message_Call: String { return self._s[1994]! } + public var PhotoEditor_FadeTool: String { return self._s[1995]! } + public var Channel_Setup_TypePublicHelp: String { return self._s[1997]! } + public var GroupInfo_InviteLink_RevokeAlert_Success: String { return self._s[2000]! } + public var Channel_Setup_PublicNoLink: String { return self._s[2001]! } + public var Privacy_Calls_P2PHelp: String { return self._s[2002]! } + public var Conversation_Info: String { return self._s[2003]! } public func Time_TodayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1992]!, self._r[1992]!, [_0]) + return formatWithArgumentRanges(self._s[2005]!, self._r[2005]!, [_0]) } - public var AutoDownloadSettings_VideosTitle: String { return self._s[1993]! } - public var Conversation_Processing: String { return self._s[1994]! } - public var Conversation_RestrictedInline: String { return self._s[1995]! } + public var AutoDownloadSettings_VideosTitle: String { return self._s[2006]! } + public var Conversation_Processing: String { return self._s[2007]! } + public var Conversation_RestrictedInline: String { return self._s[2008]! } public func InstantPage_AuthorAndDateTitle(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1999]!, self._r[1999]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2012]!, self._r[2012]!, [_1, _2]) } public func Watch_LastSeen_AtDate(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2000]!, self._r[2000]!, [_0]) + return formatWithArgumentRanges(self._s[2013]!, self._r[2013]!, [_0]) } - public var Conversation_Location: String { return self._s[2001]! } - public var DialogList_PasscodeLockHelp: String { return self._s[2002]! } - public var Channel_Management_Title: String { return self._s[2003]! } - public var Notifications_InAppNotificationsPreview: String { return self._s[2004]! } - public var EnterPasscode_EnterTitle: String { return self._s[2006]! } - public var ReportPeer_ReasonOther_Title: String { return self._s[2007]! } - public var Month_GenJanuary: String { return self._s[2008]! } - public var Conversation_ForwardChats: String { return self._s[2009]! } - public var Channel_UpdatePhotoItem: String { return self._s[2011]! } - public var UserInfo_StartSecretChat: String { return self._s[2012]! } - public var PrivacySettings_LastSeenNobody: String { return self._s[2013]! } + public var Conversation_Location: String { return self._s[2014]! } + public var DialogList_PasscodeLockHelp: String { return self._s[2015]! } + public var Channel_Management_Title: String { return self._s[2016]! } + public var Notifications_InAppNotificationsPreview: String { return self._s[2017]! } + public var EnterPasscode_EnterTitle: String { return self._s[2019]! } + public var ReportPeer_ReasonOther_Title: String { return self._s[2020]! } + public var Month_GenJanuary: String { return self._s[2021]! } + public var Conversation_ForwardChats: String { return self._s[2022]! } + public var Channel_UpdatePhotoItem: String { return self._s[2024]! } + public var UserInfo_StartSecretChat: String { return self._s[2025]! } + public var PrivacySettings_LastSeenNobody: String { return self._s[2026]! } public func FileSize_MB(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2014]!, self._r[2014]!, [_0]) + return formatWithArgumentRanges(self._s[2027]!, self._r[2027]!, [_0]) } - public var TwoStepAuth_ConfirmationAbort: String { return self._s[2017]! } - public var ChatSearch_SearchPlaceholder: String { return self._s[2018]! } - public var FastTwoStepSetup_HintSection: String { return self._s[2019]! } - public var TwoStepAuth_SetupPasswordDescription: String { return self._s[2022]! } - public var TwoStepAuth_SetupPasswordConfirmFailed: String { return self._s[2024]! } + public var ChatSearch_SearchPlaceholder: String { return self._s[2030]! } + public var TwoStepAuth_ConfirmationAbort: String { return self._s[2031]! } + public var FastTwoStepSetup_HintSection: String { return self._s[2032]! } + public var TwoStepAuth_SetupPasswordDescription: String { return self._s[2035]! } + public var TwoStepAuth_SetupPasswordConfirmFailed: String { return self._s[2037]! } public func LastSeen_YesterdayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2025]!, self._r[2025]!, [_0]) + return formatWithArgumentRanges(self._s[2038]!, self._r[2038]!, [_0]) } - public var GroupInfo_GroupHistoryVisible: String { return self._s[2027]! } - public var AppleWatch_ReplyPresetsHelp: String { return self._s[2028]! } - public var Localization_LanguageName: String { return self._s[2029]! } - public var Map_OpenIn: String { return self._s[2030]! } - public var Message_File: String { return self._s[2031]! } - public var Call_ReportSend: String { return self._s[2032]! } + public var GroupInfo_GroupHistoryVisible: String { return self._s[2040]! } + public var AppleWatch_ReplyPresetsHelp: String { return self._s[2041]! } + public var Localization_LanguageName: String { return self._s[2042]! } + public var Map_OpenIn: String { return self._s[2043]! } + public var Message_File: String { return self._s[2044]! } + public var Call_ReportSend: String { return self._s[2045]! } public func Channel_AdminLog_MessageChangedGroupUsername(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2033]!, self._r[2033]!, [_0]) + return formatWithArgumentRanges(self._s[2046]!, self._r[2046]!, [_0]) } public func CHAT_MESSAGE_GAME(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2034]!, self._r[2034]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[2047]!, self._r[2047]!, [_1, _2, _3]) } public func Time_PreciseDate_m1(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2035]!, self._r[2035]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[2048]!, self._r[2048]!, [_1, _2, _3]) } - public var Month_ShortMay: String { return self._s[2038]! } - public var Tour_Text3: String { return self._s[2039]! } - public var Notification_Exceptions_NewException_NotificationHeader: String { return self._s[2040]! } - public var Contacts_GlobalSearch: String { return self._s[2041]! } - public var DialogList_LanguageTooltip: String { return self._s[2042]! } - public var AuthSessions_LogOutApplications: String { return self._s[2043]! } - public var Map_LoadError: String { return self._s[2044]! } - public var Notifications_DisplayNamesOnLockScreenInfoWithLink: String { return self._s[2045]! } - public var Settings_ProxyConnecting: String { return self._s[2046]! } - public var Passport_Language_fa: String { return self._s[2048]! } - public var AccessDenied_VoiceMicrophone: String { return self._s[2049]! } + public var Month_ShortMay: String { return self._s[2051]! } + public var Tour_Text3: String { return self._s[2052]! } + public var Notification_Exceptions_NewException_NotificationHeader: String { return self._s[2053]! } + public var Contacts_GlobalSearch: String { return self._s[2054]! } + public var DialogList_LanguageTooltip: String { return self._s[2055]! } + public var AuthSessions_LogOutApplications: String { return self._s[2056]! } + public var Map_LoadError: String { return self._s[2057]! } + public var Notifications_DisplayNamesOnLockScreenInfoWithLink: String { return self._s[2058]! } + public var Settings_ProxyConnecting: String { return self._s[2059]! } + public var Passport_Language_fa: String { return self._s[2061]! } + public var AccessDenied_VoiceMicrophone: String { return self._s[2062]! } public func CHANNEL_MESSAGE_STICKER(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2052]!, self._r[2052]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2065]!, self._r[2065]!, [_1, _2]) } - public var Passport_Address_TypeUtilityBillUploadScan: String { return self._s[2053]! } - public var PrivacySettings_Title: String { return self._s[2054]! } - public var PasscodeSettings_TurnPasscodeOff: String { return self._s[2057]! } - public var MediaPicker_AddCaption: String { return self._s[2058]! } - public var Channel_AdminLog_BanReadMessages: String { return self._s[2059]! } - public var Channel_Status: String { return self._s[2060]! } - public var Map_ChooseLocationTitle: String { return self._s[2061]! } - public var Notifications_ChannelNotifications: String { return self._s[2062]! } - public var Map_OpenInYandexNavigator: String { return self._s[2063]! } + public var Passport_Address_TypeUtilityBillUploadScan: String { return self._s[2066]! } + public var PrivacySettings_Title: String { return self._s[2067]! } + public var PasscodeSettings_TurnPasscodeOff: String { return self._s[2070]! } + public var MediaPicker_AddCaption: String { return self._s[2071]! } + public var Channel_AdminLog_BanReadMessages: String { return self._s[2072]! } + public var Channel_Status: String { return self._s[2073]! } + public var Map_ChooseLocationTitle: String { return self._s[2074]! } + public var Notifications_ChannelNotifications: String { return self._s[2075]! } + public var Map_OpenInYandexNavigator: String { return self._s[2076]! } public func TwoStepAuth_ConfirmEmailDescription(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2064]!, self._r[2064]!, [_1]) + return formatWithArgumentRanges(self._s[2077]!, self._r[2077]!, [_1]) } - public var AutoNightTheme_PreferredTheme: String { return self._s[2065]! } - public var State_WaitingForNetwork: String { return self._s[2066]! } - public var TwoStepAuth_EmailHelp: String { return self._s[2067]! } - public var Conversation_StopLiveLocation: String { return self._s[2068]! } - public var Privacy_SecretChatsLinkPreviewsHelp: String { return self._s[2069]! } - public var PhotoEditor_SharpenTool: String { return self._s[2070]! } - public var Common_of: String { return self._s[2071]! } - public var AuthSessions_Title: String { return self._s[2072]! } - public var Passport_Scans_UploadNew: String { return self._s[2073]! } - public var Message_PinnedLiveLocationMessage: String { return self._s[2074]! } - public var Passport_FieldIdentityDetailsHelp: String { return self._s[2075]! } - public var PrivacyLastSeenSettings_AlwaysShareWith: String { return self._s[2076]! } - public var EnterPasscode_EnterPasscode: String { return self._s[2077]! } - public var Notifications_Reset: String { return self._s[2078]! } + public var AutoNightTheme_PreferredTheme: String { return self._s[2078]! } + public var State_WaitingForNetwork: String { return self._s[2079]! } + public var TwoStepAuth_EmailHelp: String { return self._s[2080]! } + public var Conversation_StopLiveLocation: String { return self._s[2081]! } + public var Username_TooManyPublicUsernamesError: String { return self._s[2082]! } + public var Privacy_SecretChatsLinkPreviewsHelp: String { return self._s[2083]! } + public var PhotoEditor_SharpenTool: String { return self._s[2084]! } + public var Common_of: String { return self._s[2085]! } + public var AuthSessions_Title: String { return self._s[2086]! } + public var Passport_Scans_UploadNew: String { return self._s[2087]! } + public var Message_PinnedLiveLocationMessage: String { return self._s[2088]! } + public var Passport_FieldIdentityDetailsHelp: String { return self._s[2089]! } + public var PrivacyLastSeenSettings_AlwaysShareWith: String { return self._s[2090]! } + public var EnterPasscode_EnterPasscode: String { return self._s[2091]! } + public var Notifications_Reset: String { return self._s[2092]! } public func Map_LiveLocationPrivateDescription(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2079]!, self._r[2079]!, [_0]) + return formatWithArgumentRanges(self._s[2093]!, self._r[2093]!, [_0]) } - public var GroupInfo_InvitationLinkGroupFull: String { return self._s[2080]! } + public var GroupInfo_InvitationLinkGroupFull: String { return self._s[2094]! } public func Channel_AdminLog_MessageChangedChannelUsername(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2082]!, self._r[2082]!, [_0]) + return formatWithArgumentRanges(self._s[2096]!, self._r[2096]!, [_0]) } public func CHAT_MESSAGE_DOC(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2083]!, self._r[2083]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2097]!, self._r[2097]!, [_1, _2]) } - public var Watch_AppName: String { return self._s[2084]! } - public var ConvertToSupergroup_HelpTitle: String { return self._s[2085]! } - public var Conversation_TapAndHoldToRecord: String { return self._s[2086]! } + public var Watch_AppName: String { return self._s[2098]! } + public var ConvertToSupergroup_HelpTitle: String { return self._s[2099]! } + public var Conversation_TapAndHoldToRecord: String { return self._s[2100]! } + public var Permissions_SiriTitle: String { return self._s[2102]! } public func MESSAGE_GIF(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2088]!, self._r[2088]!, [_1]) + return formatWithArgumentRanges(self._s[2103]!, self._r[2103]!, [_1]) } public func DialogList_EncryptedChatStartedOutgoing(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2089]!, self._r[2089]!, [_0]) + return formatWithArgumentRanges(self._s[2104]!, self._r[2104]!, [_0]) } - public var Checkout_PayWithTouchId: String { return self._s[2090]! } - public var Passport_Language_ko: String { return self._s[2091]! } - public var Conversation_DiscardVoiceMessageTitle: String { return self._s[2092]! } + public var Checkout_PayWithTouchId: String { return self._s[2105]! } + public var Passport_Language_ko: String { return self._s[2106]! } + public var Conversation_DiscardVoiceMessageTitle: String { return self._s[2107]! } public func CHAT_ADD_YOU(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2093]!, self._r[2093]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2108]!, self._r[2108]!, [_1, _2]) } - public var CheckoutInfo_ShippingInfoCity: String { return self._s[2094]! } - public var Group_AdminLog_EmptyText: String { return self._s[2095]! } - public var AutoDownloadSettings_GroupChats: String { return self._s[2096]! } - public var TwoStepAuth_AddHintTitle: String { return self._s[2097]! } - public var Conversation_ClousStorageInfo_Description3: String { return self._s[2099]! } - public var Notifications_ExceptionsMuted: String { return self._s[2100]! } - public var Conversation_PinMessageAlertGroup: String { return self._s[2101]! } - public var TwoStepAuth_RecoveryEmailTitle: String { return self._s[2103]! } - public var Settings_FAQ_Intro: String { return self._s[2104]! } - public var PrivacySettings_AuthSessions: String { return self._s[2105]! } + public var CheckoutInfo_ShippingInfoCity: String { return self._s[2109]! } + public var Group_AdminLog_EmptyText: String { return self._s[2110]! } + public var AutoDownloadSettings_GroupChats: String { return self._s[2111]! } + public var TwoStepAuth_AddHintTitle: String { return self._s[2112]! } + public var Conversation_ClousStorageInfo_Description3: String { return self._s[2114]! } + public var Notifications_ExceptionsMuted: String { return self._s[2115]! } + public var Conversation_PinMessageAlertGroup: String { return self._s[2116]! } + public var TwoStepAuth_RecoveryEmailTitle: String { return self._s[2118]! } + public var Settings_FAQ_Intro: String { return self._s[2119]! } + public var PrivacySettings_AuthSessions: String { return self._s[2120]! } public func CHAT_MESSAGE_GEOLIVE(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2106]!, self._r[2106]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2121]!, self._r[2121]!, [_1, _2]) } - public var Passport_Address_Postcode: String { return self._s[2108]! } - public var Tour_Title5: String { return self._s[2109]! } - public var ChatAdmins_AllMembersAreAdmins: String { return self._s[2110]! } - public var Group_Management_AddModeratorHelp: String { return self._s[2111]! } - public var Channel_Username_CheckingUsername: String { return self._s[2112]! } + public var Passport_Address_Postcode: String { return self._s[2123]! } + public var Tour_Title5: String { return self._s[2124]! } + public var ChatAdmins_AllMembersAreAdmins: String { return self._s[2125]! } + public var Group_Management_AddModeratorHelp: String { return self._s[2126]! } + public var Channel_Username_CheckingUsername: String { return self._s[2127]! } public func DialogList_SingleRecordingVideoMessageSuffix(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2114]!, self._r[2114]!, [_0]) + return formatWithArgumentRanges(self._s[2129]!, self._r[2129]!, [_0]) } public func Contacts_AccessDeniedHelpPortrait(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2118]!, self._r[2118]!, [_0]) + return formatWithArgumentRanges(self._s[2133]!, self._r[2133]!, [_0]) } public func Checkout_LiabilityAlert(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2119]!, self._r[2119]!, [_1, _1, _1, _2]) + return formatWithArgumentRanges(self._s[2134]!, self._r[2134]!, [_1, _1, _1, _2]) } - public var Channel_Info_BlackList: String { return self._s[2120]! } - public var Profile_BotInfo: String { return self._s[2121]! } - public var Stickers_SuggestAll: String { return self._s[2122]! } - public var Compose_NewChannel_Members: String { return self._s[2123]! } - public var Notification_Reply: String { return self._s[2124]! } - public var Watch_Stickers_Recents: String { return self._s[2126]! } - public var GroupInfo_SetGroupPhotoStop: String { return self._s[2127]! } - public var Channel_Stickers_Placeholder: String { return self._s[2128]! } - public var AttachmentMenu_File: String { return self._s[2129]! } + public var Channel_Info_BlackList: String { return self._s[2135]! } + public var Profile_BotInfo: String { return self._s[2136]! } + public var Stickers_SuggestAll: String { return self._s[2137]! } + public var Compose_NewChannel_Members: String { return self._s[2138]! } + public var Notification_Reply: String { return self._s[2139]! } + public var Watch_Stickers_Recents: String { return self._s[2141]! } + public var GroupInfo_SetGroupPhotoStop: String { return self._s[2142]! } + public var Channel_Stickers_Placeholder: String { return self._s[2143]! } + public var AttachmentMenu_File: String { return self._s[2144]! } public func MESSAGE_STICKER(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2130]!, self._r[2130]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2145]!, self._r[2145]!, [_1, _2]) } - public var Profile_MessageLifetime5s: String { return self._s[2131]! } - public var Privacy_ContactsReset: String { return self._s[2133]! } - public var TwoStepAuth_ChangePasswordDescription: String { return self._s[2134]! } + public var Profile_MessageLifetime5s: String { return self._s[2146]! } + public var Privacy_ContactsReset: String { return self._s[2148]! } + public var Permissions_ContactsTitle: String { return self._s[2149]! } + public var TwoStepAuth_ChangePasswordDescription: String { return self._s[2150]! } public func PINNED_PHOTO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2135]!, self._r[2135]!, [_1]) + return formatWithArgumentRanges(self._s[2151]!, self._r[2151]!, [_1]) } - public var Channel_AdminLog_CanAddAdmins: String { return self._s[2138]! } - public var TwoStepAuth_SetupHint: String { return self._s[2139]! } - public var Conversation_StatusLeftGroup: String { return self._s[2140]! } - public var Settings_CopyUsername: String { return self._s[2141]! } - public var Passport_Identity_CountryPlaceholder: String { return self._s[2142]! } - public var ChatSettings_AutoDownloadDocuments: String { return self._s[2143]! } - public var MediaPicker_TapToUngroupDescription: String { return self._s[2144]! } - public var Conversation_ShareBotLocationConfirmation: String { return self._s[2145]! } - public var Conversation_DeleteMessagesForMe: String { return self._s[2146]! } - public var Notification_PassportValuePersonalDetails: String { return self._s[2147]! } - public var Message_PinnedAnimationMessage: String { return self._s[2148]! } - public var Passport_FieldIdentityUploadHelp: String { return self._s[2149]! } - public var SocksProxySetup_ConnectAndSave: String { return self._s[2150]! } - public var SocksProxySetup_FailedToConnect: String { return self._s[2151]! } - public var Checkout_ErrorPrecheckoutFailed: String { return self._s[2152]! } - public var Camera_PhotoMode: String { return self._s[2154]! } + public var Channel_AdminLog_CanAddAdmins: String { return self._s[2154]! } + public var TwoStepAuth_SetupHint: String { return self._s[2155]! } + public var Conversation_StatusLeftGroup: String { return self._s[2156]! } + public var Settings_CopyUsername: String { return self._s[2157]! } + public var Passport_Identity_CountryPlaceholder: String { return self._s[2158]! } + public var ChatSettings_AutoDownloadDocuments: String { return self._s[2159]! } + public var MediaPicker_TapToUngroupDescription: String { return self._s[2160]! } + public var Conversation_ShareBotLocationConfirmation: String { return self._s[2161]! } + public var Conversation_DeleteMessagesForMe: String { return self._s[2162]! } + public var Notification_PassportValuePersonalDetails: String { return self._s[2163]! } + public var Message_PinnedAnimationMessage: String { return self._s[2164]! } + public var Passport_FieldIdentityUploadHelp: String { return self._s[2165]! } + public var SocksProxySetup_ConnectAndSave: String { return self._s[2166]! } + public var SocksProxySetup_FailedToConnect: String { return self._s[2167]! } + public var Checkout_ErrorPrecheckoutFailed: String { return self._s[2168]! } + public var Camera_PhotoMode: String { return self._s[2170]! } public func Time_MonthOfYear_m2(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2156]!, self._r[2156]!, [_0]) + return formatWithArgumentRanges(self._s[2172]!, self._r[2172]!, [_0]) } - public var Channel_About_Placeholder: String { return self._s[2157]! } - public var Map_Directions: String { return self._s[2159]! } - public var Channel_About_Title: String { return self._s[2160]! } + public var Channel_About_Placeholder: String { return self._s[2173]! } + public var Map_Directions: String { return self._s[2175]! } + public var Channel_About_Title: String { return self._s[2176]! } public func MESSAGE_PHOTO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2161]!, self._r[2161]!, [_1]) + return formatWithArgumentRanges(self._s[2177]!, self._r[2177]!, [_1]) } - public var Calls_RatingTitle: String { return self._s[2162]! } - public var SharedMedia_EmptyText: String { return self._s[2163]! } - public var Channel_Stickers_Searching: String { return self._s[2164]! } - public var Passport_Address_AddUtilityBill: String { return self._s[2165]! } - public var Login_PadPhoneHelp: String { return self._s[2166]! } - public var StickerPacksSettings_ArchivedPacks: String { return self._s[2168]! } - public var Passport_Language_th: String { return self._s[2169]! } - public var Channel_ErrorAccessDenied: String { return self._s[2170]! } - public var Generic_ErrorMoreInfo: String { return self._s[2172]! } - public var Channel_AdminLog_TitleAllEvents: String { return self._s[2173]! } - public var Settings_Proxy: String { return self._s[2174]! } - public var Passport_Language_lt: String { return self._s[2175]! } - public var TwoStepAuth_ConfirmEmailResendCode: String { return self._s[2176]! } - public var ChannelMembers_WhoCanAddMembersAllHelp: String { return self._s[2178]! } - public var Passport_Address_CountryPlaceholder: String { return self._s[2179]! } - public var ChangePhoneNumberCode_CodePlaceholder: String { return self._s[2180]! } - public var Camera_SquareMode: String { return self._s[2181]! } + public var Calls_RatingTitle: String { return self._s[2178]! } + public var SharedMedia_EmptyText: String { return self._s[2179]! } + public var Channel_Stickers_Searching: String { return self._s[2180]! } + public var Passport_Address_AddUtilityBill: String { return self._s[2181]! } + public var Login_PadPhoneHelp: String { return self._s[2182]! } + public var StickerPacksSettings_ArchivedPacks: String { return self._s[2184]! } + public var Passport_Language_th: String { return self._s[2185]! } + public var Channel_ErrorAccessDenied: String { return self._s[2186]! } + public var Generic_ErrorMoreInfo: String { return self._s[2188]! } + public var Channel_AdminLog_TitleAllEvents: String { return self._s[2189]! } + public var Settings_Proxy: String { return self._s[2190]! } + public var Passport_Language_lt: String { return self._s[2191]! } + public var TwoStepAuth_ConfirmEmailResendCode: String { return self._s[2192]! } + public var Channel_Username_RevokeExistingUsernamesInfo: String { return self._s[2194]! } + public var ChannelMembers_WhoCanAddMembersAllHelp: String { return self._s[2195]! } + public var Passport_Address_CountryPlaceholder: String { return self._s[2196]! } + public var ChangePhoneNumberCode_CodePlaceholder: String { return self._s[2197]! } + public var Camera_SquareMode: String { return self._s[2198]! } public func Conversation_EncryptedPlaceholderTitleOutgoing(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2182]!, self._r[2182]!, [_0]) + return formatWithArgumentRanges(self._s[2199]!, self._r[2199]!, [_0]) } - public var NetworkUsageSettings_CallDataSection: String { return self._s[2183]! } - public var Login_PadPhoneHelpTitle: String { return self._s[2184]! } - public var Profile_CreateNewContact: String { return self._s[2185]! } - public var AccessDenied_VideoMessageMicrophone: String { return self._s[2186]! } - public var AutoDownloadSettings_VoiceMessagesTitle: String { return self._s[2187]! } - public var PhotoEditor_VignetteTool: String { return self._s[2188]! } - public var LastSeen_WithinAWeek: String { return self._s[2189]! } - public var Widget_NoUsers: String { return self._s[2190]! } - public var Passport_Identity_DocumentNumber: String { return self._s[2192]! } - public var Application_Update: String { return self._s[2193]! } - public var Calls_NewCall: String { return self._s[2194]! } + public var NetworkUsageSettings_CallDataSection: String { return self._s[2200]! } + public var Login_PadPhoneHelpTitle: String { return self._s[2201]! } + public var Profile_CreateNewContact: String { return self._s[2202]! } + public var AccessDenied_VideoMessageMicrophone: String { return self._s[2203]! } + public var AutoDownloadSettings_VoiceMessagesTitle: String { return self._s[2204]! } + public var PhotoEditor_VignetteTool: String { return self._s[2205]! } + public var LastSeen_WithinAWeek: String { return self._s[2206]! } + public var Widget_NoUsers: String { return self._s[2207]! } + public var Passport_Identity_DocumentNumber: String { return self._s[2209]! } + public var Application_Update: String { return self._s[2210]! } + public var Calls_NewCall: String { return self._s[2211]! } public func CHANNEL_MESSAGE_AUDIO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2195]!, self._r[2195]!, [_1]) + return formatWithArgumentRanges(self._s[2212]!, self._r[2212]!, [_1]) } - public var DialogList_NoMessagesText: String { return self._s[2196]! } - public var MaskStickerSettings_Info: String { return self._s[2197]! } - public var ChatSettings_AutoDownloadTitle: String { return self._s[2198]! } - public var Passport_FieldAddressHelp: String { return self._s[2199]! } - public var Passport_Language_dz: String { return self._s[2200]! } - public var Conversation_FilePhotoOrVideo: String { return self._s[2201]! } - public var Channel_AdminLog_BanSendStickers: String { return self._s[2202]! } - public var Common_Next: String { return self._s[2203]! } - public var Stickers_RemoveFromFavorites: String { return self._s[2204]! } - public var Watch_Notification_Joined: String { return self._s[2205]! } + public var DialogList_NoMessagesText: String { return self._s[2213]! } + public var MaskStickerSettings_Info: String { return self._s[2214]! } + public var ChatSettings_AutoDownloadTitle: String { return self._s[2215]! } + public var Passport_FieldAddressHelp: String { return self._s[2216]! } + public var Passport_Language_dz: String { return self._s[2217]! } + public var Conversation_FilePhotoOrVideo: String { return self._s[2218]! } + public var Channel_AdminLog_BanSendStickers: String { return self._s[2219]! } + public var Common_Next: String { return self._s[2220]! } + public var Stickers_RemoveFromFavorites: String { return self._s[2221]! } + public var Watch_Notification_Joined: String { return self._s[2222]! } public func Channel_AdminLog_MessageRestrictedNewSetting(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2206]!, self._r[2206]!, [_0]) + return formatWithArgumentRanges(self._s[2223]!, self._r[2223]!, [_0]) } - public var Passport_DeleteAddress: String { return self._s[2207]! } - public var ContactInfo_PhoneLabelHome: String { return self._s[2208]! } - public var GroupInfo_DeleteAndExitConfirmation: String { return self._s[2209]! } - public var NotificationsSound_Tremolo: String { return self._s[2210]! } - public var TwoStepAuth_EmailInvalid: String { return self._s[2211]! } - public var Privacy_ContactsTitle: String { return self._s[2212]! } - public var Passport_Address_TypeBankStatement: String { return self._s[2214]! } + public var Passport_DeleteAddress: String { return self._s[2224]! } + public var ContactInfo_PhoneLabelHome: String { return self._s[2225]! } + public var GroupInfo_DeleteAndExitConfirmation: String { return self._s[2226]! } + public var NotificationsSound_Tremolo: String { return self._s[2227]! } + public var TwoStepAuth_EmailInvalid: String { return self._s[2228]! } + public var Privacy_ContactsTitle: String { return self._s[2229]! } + public var Passport_Address_TypeBankStatement: String { return self._s[2231]! } public func CHAT_MESSAGE_VIDEO(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2215]!, self._r[2215]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2232]!, self._r[2232]!, [_1, _2]) } - public var Month_GenJune: String { return self._s[2216]! } - public var Map_LiveLocationFor15Minutes: String { return self._s[2217]! } + public var Month_GenJune: String { return self._s[2233]! } + public var Map_LiveLocationFor15Minutes: String { return self._s[2234]! } public func Login_EmailCodeSubject(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2218]!, self._r[2218]!, [_0]) + return formatWithArgumentRanges(self._s[2235]!, self._r[2235]!, [_0]) } public func CHAT_TITLE_EDITED(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2219]!, self._r[2219]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2236]!, self._r[2236]!, [_1, _2]) } - public var ContactInfo_PhoneLabelHomeFax: String { return self._s[2220]! } + public var ContactInfo_PhoneLabelHomeFax: String { return self._s[2237]! } public func NetworkUsageSettings_WifiUsageSince(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2221]!, self._r[2221]!, [_0]) + return formatWithArgumentRanges(self._s[2238]!, self._r[2238]!, [_0]) } - public var Watch_LastSeen_Lately: String { return self._s[2222]! } - public var Watch_Compose_CurrentLocation: String { return self._s[2223]! } - public var DialogList_RecentTitlePeople: String { return self._s[2225]! } - public var GroupInfo_Notifications: String { return self._s[2226]! } - public var Call_ReportPlaceholder: String { return self._s[2227]! } + public var Watch_LastSeen_Lately: String { return self._s[2239]! } + public var Watch_Compose_CurrentLocation: String { return self._s[2240]! } + public var DialogList_RecentTitlePeople: String { return self._s[2242]! } + public var GroupInfo_Notifications: String { return self._s[2243]! } + public var Call_ReportPlaceholder: String { return self._s[2244]! } public func AuthSessions_Message(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2228]!, self._r[2228]!, [_0]) + return formatWithArgumentRanges(self._s[2245]!, self._r[2245]!, [_0]) } public func MESSAGE_DOC(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2229]!, self._r[2229]!, [_1]) + return formatWithArgumentRanges(self._s[2246]!, self._r[2246]!, [_1]) } - public var Group_Username_CreatePrivateLinkHelp: String { return self._s[2230]! } - public var Notifications_GroupNotificationsSound: String { return self._s[2231]! } - public var AuthSessions_EmptyTitle: String { return self._s[2232]! } - public var Privacy_GroupsAndChannels_AlwaysAllow_Title: String { return self._s[2234]! } - public var Passport_Language_he: String { return self._s[2235]! } + public var Group_Username_CreatePrivateLinkHelp: String { return self._s[2247]! } + public var Notifications_GroupNotificationsSound: String { return self._s[2248]! } + public var AuthSessions_EmptyTitle: String { return self._s[2249]! } + public var Privacy_GroupsAndChannels_AlwaysAllow_Title: String { return self._s[2251]! } + public var InstantPage_Reference: String { return self._s[2252]! } + public var Passport_Language_he: String { return self._s[2253]! } public func MediaPicker_Nof(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2236]!, self._r[2236]!, [_0]) + return formatWithArgumentRanges(self._s[2254]!, self._r[2254]!, [_0]) } - public var Common_Create: String { return self._s[2237]! } - public var Contacts_TopSection: String { return self._s[2238]! } + public var Common_Create: String { return self._s[2255]! } + public var Contacts_TopSection: String { return self._s[2256]! } public func Map_DirectionsDriveEta(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2239]!, self._r[2239]!, [_0]) + return formatWithArgumentRanges(self._s[2257]!, self._r[2257]!, [_0]) } - public var PrivacyPolicy_DeclineMessage: String { return self._s[2240]! } - public var Your_cards_number_is_invalid: String { return self._s[2241]! } + public var PrivacyPolicy_DeclineMessage: String { return self._s[2258]! } + public var Your_cards_number_is_invalid: String { return self._s[2259]! } public func MESSAGE_INVOICE(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2242]!, self._r[2242]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2260]!, self._r[2260]!, [_1, _2]) } - public var Localization_LanguageCustom: String { return self._s[2243]! } + public var Localization_LanguageCustom: String { return self._s[2261]! } public func Channel_AdminLog_MessageRemovedChannelUsername(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2244]!, self._r[2244]!, [_0]) + return formatWithArgumentRanges(self._s[2262]!, self._r[2262]!, [_0]) } - public var Group_MessagePhotoRemoved: String { return self._s[2245]! } - public var Appearance_Animations: String { return self._s[2246]! } - public var UserInfo_AddToExisting: String { return self._s[2247]! } - public var NotificationsSound_Aurora: String { return self._s[2248]! } + public var Group_MessagePhotoRemoved: String { return self._s[2263]! } + public var Appearance_Animations: String { return self._s[2264]! } + public var UserInfo_AddToExisting: String { return self._s[2265]! } + public var NotificationsSound_Aurora: String { return self._s[2266]! } public func LastSeen_AtDate(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2251]!, self._r[2251]!, [_0]) + return formatWithArgumentRanges(self._s[2269]!, self._r[2269]!, [_0]) } - public var Conversation_MessageDialogRetry: String { return self._s[2252]! } - public var Watch_ChatList_NoConversationsTitle: String { return self._s[2253]! } - public var Passport_Language_my: String { return self._s[2254]! } - public var Stickers_GroupStickers: String { return self._s[2256]! } - public var BlockedUsers_Title: String { return self._s[2258]! } + public var Conversation_MessageDialogRetry: String { return self._s[2270]! } + public var Watch_ChatList_NoConversationsTitle: String { return self._s[2271]! } + public var Passport_Language_my: String { return self._s[2272]! } + public var Stickers_GroupStickers: String { return self._s[2274]! } + public var BlockedUsers_Title: String { return self._s[2276]! } public func LiveLocationUpdated_TodayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2259]!, self._r[2259]!, [_0]) + return formatWithArgumentRanges(self._s[2277]!, self._r[2277]!, [_0]) } - public var ContactInfo_PhoneLabelWork: String { return self._s[2260]! } - public var ChatSettings_ConnectionType_UseSocks5: String { return self._s[2261]! } - public var Passport_FieldAddressTranslationHelp: String { return self._s[2262]! } - public var Cache_ClearNone: String { return self._s[2263]! } - public var SecretTimer_VideoDescription: String { return self._s[2265]! } - public var Login_InvalidCodeError: String { return self._s[2266]! } - public var Channel_BanList_BlockedTitle: String { return self._s[2268]! } - public var Passport_PasswordHelp: String { return self._s[2269]! } - public var NetworkUsageSettings_Cellular: String { return self._s[2270]! } - public var Watch_Location_Access: String { return self._s[2271]! } - public var PrivacySettings_DeleteAccountIfAwayFor: String { return self._s[2273]! } - public var Channel_AdminLog_EmptyFilterText: String { return self._s[2274]! } - public var Channel_AdminLog_EmptyText: String { return self._s[2275]! } - public var PrivacySettings_DeleteAccountTitle: String { return self._s[2276]! } - public var Passport_Language_ms: String { return self._s[2277]! } - public var PrivacyLastSeenSettings_CustomShareSettings_Delete: String { return self._s[2278]! } + public var ContactInfo_PhoneLabelWork: String { return self._s[2278]! } + public var ChatSettings_ConnectionType_UseSocks5: String { return self._s[2279]! } + public var Passport_FieldAddressTranslationHelp: String { return self._s[2280]! } + public var Cache_ClearNone: String { return self._s[2281]! } + public var SecretTimer_VideoDescription: String { return self._s[2283]! } + public var Login_InvalidCodeError: String { return self._s[2284]! } + public var Channel_BanList_BlockedTitle: String { return self._s[2286]! } + public var Passport_PasswordHelp: String { return self._s[2287]! } + public var NetworkUsageSettings_Cellular: String { return self._s[2288]! } + public var Watch_Location_Access: String { return self._s[2289]! } + public var PrivacySettings_DeleteAccountIfAwayFor: String { return self._s[2291]! } + public var Channel_AdminLog_EmptyFilterText: String { return self._s[2292]! } + public var Channel_AdminLog_EmptyText: String { return self._s[2293]! } + public var PrivacySettings_DeleteAccountTitle: String { return self._s[2294]! } + public var Passport_Language_ms: String { return self._s[2295]! } + public var PrivacyLastSeenSettings_CustomShareSettings_Delete: String { return self._s[2296]! } public func ENCRYPTED_MESSAGE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2279]!, self._r[2279]!, [_1]) + return formatWithArgumentRanges(self._s[2297]!, self._r[2297]!, [_1]) } - public var Watch_LastSeen_WithinAMonth: String { return self._s[2280]! } - public var PrivacyLastSeenSettings_CustomHelp: String { return self._s[2281]! } - public var TwoStepAuth_EnterPasswordHelp: String { return self._s[2282]! } - public var TwoStepAuth_SetupResendEmailCode: String { return self._s[2283]! } - public var Bot_Stop: String { return self._s[2284]! } - public var Privacy_GroupsAndChannels_AlwaysAllow_Placeholder: String { return self._s[2285]! } - public var UserInfo_BotSettings: String { return self._s[2286]! } - public var Your_cards_expiration_month_is_invalid: String { return self._s[2287]! } - public var Passport_FieldIdentity: String { return self._s[2288]! } - public var PrivacyLastSeenSettings_EmpryUsersPlaceholder: String { return self._s[2289]! } - public var Passport_Identity_EditInternalPassport: String { return self._s[2290]! } + public var Watch_LastSeen_WithinAMonth: String { return self._s[2298]! } + public var PrivacyLastSeenSettings_CustomHelp: String { return self._s[2299]! } + public var TwoStepAuth_EnterPasswordHelp: String { return self._s[2300]! } + public var TwoStepAuth_SetupResendEmailCode: String { return self._s[2301]! } + public var Bot_Stop: String { return self._s[2302]! } + public var Privacy_GroupsAndChannels_AlwaysAllow_Placeholder: String { return self._s[2303]! } + public var UserInfo_BotSettings: String { return self._s[2304]! } + public var Your_cards_expiration_month_is_invalid: String { return self._s[2305]! } + public var Passport_FieldIdentity: String { return self._s[2306]! } + public var PrivacyLastSeenSettings_EmpryUsersPlaceholder: String { return self._s[2307]! } + public var Passport_Identity_EditInternalPassport: String { return self._s[2308]! } public func CHANNEL_MESSAGE_ROUND(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2292]!, self._r[2292]!, [_1]) + return formatWithArgumentRanges(self._s[2310]!, self._r[2310]!, [_1]) } - public var Passport_Identity_LatinNameHelp: String { return self._s[2293]! } - public var ApplyLanguage_LanguageNotSupportedError: String { return self._s[2294]! } - public var SocksProxySetup_Port: String { return self._s[2295]! } - public var Message_VideoMessage: String { return self._s[2297]! } - public var Conversation_ContextMenuStickerPackInfo: String { return self._s[2298]! } - public var Login_ResetAccountProtected_LimitExceeded: String { return self._s[2299]! } + public var Passport_Identity_LatinNameHelp: String { return self._s[2311]! } + public var ApplyLanguage_LanguageNotSupportedError: String { return self._s[2312]! } + public var SocksProxySetup_Port: String { return self._s[2313]! } + public var Message_VideoMessage: String { return self._s[2315]! } + public var Conversation_ContextMenuStickerPackInfo: String { return self._s[2316]! } + public var Login_ResetAccountProtected_LimitExceeded: String { return self._s[2317]! } public func CHAT_DELETE_MEMBER(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2300]!, self._r[2300]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[2318]!, self._r[2318]!, [_1, _2, _3]) } - public var Conversation_DiscardVoiceMessageAction: String { return self._s[2301]! } - public var Camera_Title: String { return self._s[2302]! } - public var Passport_Identity_IssueDate: String { return self._s[2303]! } - public var PhotoEditor_CurvesBlue: String { return self._s[2305]! } - public var Message_PinnedVideoMessage: String { return self._s[2306]! } + public var Conversation_DiscardVoiceMessageAction: String { return self._s[2319]! } + public var Camera_Title: String { return self._s[2320]! } + public var Passport_Identity_IssueDate: String { return self._s[2321]! } + public var PhotoEditor_CurvesBlue: String { return self._s[2323]! } + public var Message_PinnedVideoMessage: String { return self._s[2324]! } public func Login_EmailPhoneSubject(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2307]!, self._r[2307]!, [_0]) + return formatWithArgumentRanges(self._s[2325]!, self._r[2325]!, [_0]) } - public var Passport_Phone_UseTelegramNumberHelp: String { return self._s[2309]! } - public var Group_EditAdmin_PermissionChangeInfo: String { return self._s[2310]! } - public var TwoStepAuth_Email: String { return self._s[2311]! } - public var Stickers_SuggestNone: String { return self._s[2312]! } - public var Map_SendMyCurrentLocation: String { return self._s[2314]! } + public var Passport_Phone_UseTelegramNumberHelp: String { return self._s[2327]! } + public var Group_EditAdmin_PermissionChangeInfo: String { return self._s[2328]! } + public var TwoStepAuth_Email: String { return self._s[2329]! } + public var Stickers_SuggestNone: String { return self._s[2330]! } + public var Map_SendMyCurrentLocation: String { return self._s[2332]! } public func MESSAGE_ROUND(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2315]!, self._r[2315]!, [_1]) + return formatWithArgumentRanges(self._s[2333]!, self._r[2333]!, [_1]) } - public var Passport_Identity_IssueDatePlaceholder: String { return self._s[2316]! } - public var Watch_Message_Invoice: String { return self._s[2317]! } - public var Map_Unknown: String { return self._s[2319]! } - public var Wallpaper_Set: String { return self._s[2321]! } - public var AccessDenied_Title: String { return self._s[2322]! } - public var SharedMedia_CategoryLinks: String { return self._s[2323]! } - public var Localization_LanguageOther: String { return self._s[2324]! } + public var Passport_Identity_IssueDatePlaceholder: String { return self._s[2334]! } + public var Watch_Message_Invoice: String { return self._s[2335]! } + public var Map_Unknown: String { return self._s[2337]! } + public var Wallpaper_Set: String { return self._s[2339]! } + public var AccessDenied_Title: String { return self._s[2340]! } + public var SharedMedia_CategoryLinks: String { return self._s[2341]! } + public var Localization_LanguageOther: String { return self._s[2342]! } public func CHAT_MESSAGES(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2325]!, self._r[2325]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[2343]!, self._r[2343]!, [_1, _2, _3]) } - public var SaveIncomingPhotosSettings_Title: String { return self._s[2326]! } - public var Passport_Identity_TypeDriversLicense: String { return self._s[2327]! } - public var FastTwoStepSetup_HintHelp: String { return self._s[2328]! } - public var Notifications_ExceptionsDefaultSound: String { return self._s[2329]! } - public var TwoStepAuth_EmailSkipAlert: String { return self._s[2330]! } - public var ChatSettings_Stickers: String { return self._s[2331]! } - public var Camera_FlashOff: String { return self._s[2332]! } - public var TwoStepAuth_Title: String { return self._s[2334]! } - public var Passport_Identity_Translation: String { return self._s[2335]! } - public var Checkout_ErrorProviderAccountTimeout: String { return self._s[2336]! } - public var TwoStepAuth_SetupPasswordEnterPasswordChange: String { return self._s[2337]! } - public var WebSearch_Images: String { return self._s[2338]! } - public var Conversation_typing: String { return self._s[2339]! } - public var Common_Back: String { return self._s[2340]! } - public var PrivacySettings_DataSettingsHelp: String { return self._s[2342]! } - public var Passport_Language_es: String { return self._s[2343]! } - public var Common_Search: String { return self._s[2344]! } + public var SaveIncomingPhotosSettings_Title: String { return self._s[2344]! } + public var Passport_Identity_TypeDriversLicense: String { return self._s[2345]! } + public var FastTwoStepSetup_HintHelp: String { return self._s[2346]! } + public var Notifications_ExceptionsDefaultSound: String { return self._s[2347]! } + public var TwoStepAuth_EmailSkipAlert: String { return self._s[2348]! } + public var ChatSettings_Stickers: String { return self._s[2349]! } + public var Camera_FlashOff: String { return self._s[2350]! } + public var TwoStepAuth_Title: String { return self._s[2352]! } + public var Passport_Identity_Translation: String { return self._s[2353]! } + public var Checkout_ErrorProviderAccountTimeout: String { return self._s[2354]! } + public var TwoStepAuth_SetupPasswordEnterPasswordChange: String { return self._s[2355]! } + public var WebSearch_Images: String { return self._s[2356]! } + public var Conversation_typing: String { return self._s[2357]! } + public var Common_Back: String { return self._s[2358]! } + public var PrivacySettings_DataSettingsHelp: String { return self._s[2360]! } + public var Passport_Language_es: String { return self._s[2361]! } + public var Common_Search: String { return self._s[2362]! } public func CancelResetAccount_Success(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2345]!, self._r[2345]!, [_0]) + return formatWithArgumentRanges(self._s[2363]!, self._r[2363]!, [_0]) } - public var Common_No: String { return self._s[2346]! } - public var Login_EmailNotConfiguredError: String { return self._s[2347]! } - public var Watch_Suggestion_OK: String { return self._s[2348]! } - public var Profile_AddToExisting: String { return self._s[2349]! } + public var Common_No: String { return self._s[2364]! } + public var Login_EmailNotConfiguredError: String { return self._s[2365]! } + public var Watch_Suggestion_OK: String { return self._s[2366]! } + public var Profile_AddToExisting: String { return self._s[2367]! } public func Passport_Identity_NativeNameTitle(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2351]!, self._r[2351]!, [_0]) + return formatWithArgumentRanges(self._s[2369]!, self._r[2369]!, [_0]) } public func PINNED_NOTEXT(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2352]!, self._r[2352]!, [_1]) + return formatWithArgumentRanges(self._s[2370]!, self._r[2370]!, [_1]) } public func Login_EmailCodeBody(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2353]!, self._r[2353]!, [_0]) + return formatWithArgumentRanges(self._s[2371]!, self._r[2371]!, [_0]) } - public var NotificationsSound_Keys: String { return self._s[2354]! } - public var Passport_Phone_Title: String { return self._s[2356]! } - public var Profile_About: String { return self._s[2357]! } + public var NotificationsSound_Keys: String { return self._s[2372]! } + public var Passport_Phone_Title: String { return self._s[2374]! } + public var Profile_About: String { return self._s[2375]! } public func EncryptionKey_Description(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2358]!, self._r[2358]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2376]!, self._r[2376]!, [_1, _2]) } - public var Conversation_UnreadMessages: String { return self._s[2359]! } + public var Conversation_UnreadMessages: String { return self._s[2377]! } public func DialogList_LiveLocationSharingTo(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2360]!, self._r[2360]!, [_0]) + return formatWithArgumentRanges(self._s[2378]!, self._r[2378]!, [_0]) } - public var Tour_Title3: String { return self._s[2361]! } - public var Passport_Identity_FrontSide: String { return self._s[2362]! } - public var PrivacyLastSeenSettings_GroupsAndChannelsHelp: String { return self._s[2363]! } - public var Watch_Contacts_NoResults: String { return self._s[2364]! } - public var Passport_Language_id: String { return self._s[2365]! } - public var Passport_Identity_TypeIdentityCardUploadScan: String { return self._s[2366]! } - public var Watch_UserInfo_MuteTitle: String { return self._s[2367]! } + public var Tour_Title3: String { return self._s[2379]! } + public var Passport_Identity_FrontSide: String { return self._s[2380]! } + public var PrivacyLastSeenSettings_GroupsAndChannelsHelp: String { return self._s[2381]! } + public var Watch_Contacts_NoResults: String { return self._s[2382]! } + public var Passport_Language_id: String { return self._s[2383]! } + public var Passport_Identity_TypeIdentityCardUploadScan: String { return self._s[2384]! } + public var Watch_UserInfo_MuteTitle: String { return self._s[2385]! } public func Privacy_GroupsAndChannels_InviteToGroupError(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2370]!, self._r[2370]!, [_0, _1]) + return formatWithArgumentRanges(self._s[2388]!, self._r[2388]!, [_0, _1]) } public func Message_PinnedTextMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2372]!, self._r[2372]!, [_0]) + return formatWithArgumentRanges(self._s[2390]!, self._r[2390]!, [_0]) } public func Watch_Time_ShortWeekdayAt(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2373]!, self._r[2373]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2391]!, self._r[2391]!, [_1, _2]) } - public var Conversation_EmptyGifPanelPlaceholder: String { return self._s[2374]! } - public var DialogList_Typing: String { return self._s[2375]! } - public var Notification_CallBack: String { return self._s[2376]! } - public var Passport_Language_ru: String { return self._s[2377]! } - public var Login_CancelSignUpConfirmation: String { return self._s[2378]! } - public var Map_LocatingError: String { return self._s[2379]! } - public var InfoPlist_NSFaceIDUsageDescription: String { return self._s[2381]! } - public var MediaPicker_Send: String { return self._s[2382]! } - public var ChannelIntro_Title: String { return self._s[2383]! } - public var AccessDenied_LocationAlwaysDenied: String { return self._s[2385]! } + public var Conversation_EmptyGifPanelPlaceholder: String { return self._s[2392]! } + public var DialogList_Typing: String { return self._s[2393]! } + public var Notification_CallBack: String { return self._s[2394]! } + public var Passport_Language_ru: String { return self._s[2395]! } + public var Login_CancelSignUpConfirmation: String { return self._s[2396]! } + public var Map_LocatingError: String { return self._s[2397]! } + public var InfoPlist_NSFaceIDUsageDescription: String { return self._s[2399]! } + public var MediaPicker_Send: String { return self._s[2400]! } + public var ChannelIntro_Title: String { return self._s[2401]! } + public var AccessDenied_LocationAlwaysDenied: String { return self._s[2403]! } public func PINNED_GIF(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2386]!, self._r[2386]!, [_1]) + return formatWithArgumentRanges(self._s[2404]!, self._r[2404]!, [_1]) } public func InviteText_SingleContact(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2387]!, self._r[2387]!, [_0]) + return formatWithArgumentRanges(self._s[2405]!, self._r[2405]!, [_0]) } - public var Passport_Address_TypePassportRegistration: String { return self._s[2388]! } - public var Channel_EditAdmin_CannotEdit: String { return self._s[2391]! } - public var LoginPassword_PasswordHelp: String { return self._s[2393]! } - public var BlockedUsers_Unblock: String { return self._s[2394]! } - public var AutoDownloadSettings_Cellular: String { return self._s[2395]! } - public var Passport_Language_ro: String { return self._s[2396]! } + public var Passport_Address_TypePassportRegistration: String { return self._s[2406]! } + public var Channel_EditAdmin_CannotEdit: String { return self._s[2409]! } + public var LoginPassword_PasswordHelp: String { return self._s[2411]! } + public var BlockedUsers_Unblock: String { return self._s[2412]! } + public var AutoDownloadSettings_Cellular: String { return self._s[2413]! } + public var Passport_Language_ro: String { return self._s[2414]! } public func Time_MonthOfYear_m1(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2397]!, self._r[2397]!, [_0]) + return formatWithArgumentRanges(self._s[2415]!, self._r[2415]!, [_0]) } - public var Appearance_PreviewIncomingText: String { return self._s[2398]! } - public var Passport_Identity_DateOfBirthPlaceholder: String { return self._s[2399]! } - public var Notifications_ChannelNotificationsExceptionsHelp: String { return self._s[2400]! } - public var Notifications_GroupNotificationsAlert: String { return self._s[2401]! } - public var Paint_Masks: String { return self._s[2402]! } - public var Appearance_ThemeDayClassic: String { return self._s[2404]! } - public var StickerPack_ErrorNotFound: String { return self._s[2405]! } - public var Appearance_ThemeNight: String { return self._s[2406]! } - public var SecretTimer_ImageDescription: String { return self._s[2407]! } + public var Appearance_PreviewIncomingText: String { return self._s[2416]! } + public var Passport_Identity_DateOfBirthPlaceholder: String { return self._s[2417]! } + public var Notifications_ChannelNotificationsExceptionsHelp: String { return self._s[2418]! } + public var Notifications_GroupNotificationsAlert: String { return self._s[2419]! } + public var Paint_Masks: String { return self._s[2420]! } + public var Appearance_ThemeDayClassic: String { return self._s[2422]! } + public var StickerPack_ErrorNotFound: String { return self._s[2423]! } + public var Appearance_ThemeNight: String { return self._s[2424]! } + public var SecretTimer_ImageDescription: String { return self._s[2425]! } + public var Permissions_ContactsAllowInSettings: String { return self._s[2426]! } public func PINNED_CONTACT(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2408]!, self._r[2408]!, [_1]) + return formatWithArgumentRanges(self._s[2427]!, self._r[2427]!, [_1]) } public func FileSize_KB(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2409]!, self._r[2409]!, [_0]) + return formatWithArgumentRanges(self._s[2428]!, self._r[2428]!, [_0]) } - public var Map_LiveLocationTitle: String { return self._s[2410]! } - public var Watch_GroupInfo_Title: String { return self._s[2411]! } - public var Channel_AdminLog_EmptyTitle: String { return self._s[2412]! } - public var PhotoEditor_Set: String { return self._s[2414]! } - public var LiveLocation_MenuStopAll: String { return self._s[2415]! } - public var SocksProxySetup_AddProxy: String { return self._s[2416]! } + public var Map_LiveLocationTitle: String { return self._s[2429]! } + public var Watch_GroupInfo_Title: String { return self._s[2430]! } + public var Channel_AdminLog_EmptyTitle: String { return self._s[2431]! } + public var PhotoEditor_Set: String { return self._s[2433]! } + public var LiveLocation_MenuStopAll: String { return self._s[2434]! } + public var SocksProxySetup_AddProxy: String { return self._s[2435]! } public func Notification_Invited(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2417]!, self._r[2417]!, [_0, _1]) + return formatWithArgumentRanges(self._s[2436]!, self._r[2436]!, [_0, _1]) } - public var Watch_AuthRequired: String { return self._s[2418]! } - public var Conversation_EncryptedDescription1: String { return self._s[2419]! } - public var AppleWatch_ReplyPresets: String { return self._s[2420]! } - public var Channel_Members_AddAdminErrorNotAMember: String { return self._s[2421]! } - public var Conversation_EncryptedDescription2: String { return self._s[2422]! } - public var SocksProxySetup_HostnamePlaceholder: String { return self._s[2423]! } - public var NetworkUsageSettings_MediaVideoDataSection: String { return self._s[2424]! } - public var Paint_Edit: String { return self._s[2425]! } - public var Passport_Language_nl: String { return self._s[2426]! } - public var LastSeen_Offline: String { return self._s[2427]! } - public var Login_CodeFloodError: String { return self._s[2428]! } - public var Conversation_EncryptedDescription3: String { return self._s[2429]! } - public var Notifications_Badge_IncludePublicGroups: String { return self._s[2431]! } - public var Conversation_EncryptedDescription4: String { return self._s[2432]! } - public var AppleWatch_Title: String { return self._s[2434]! } - public var Contacts_AccessDeniedError: String { return self._s[2435]! } - public var Conversation_StatusTyping: String { return self._s[2436]! } - public var Share_Title: String { return self._s[2437]! } - public var TwoStepAuth_ConfirmationTitle: String { return self._s[2438]! } - public var Passport_Identity_FilesTitle: String { return self._s[2439]! } - public var ChatSettings_Title: String { return self._s[2440]! } - public var AuthSessions_CurrentSession: String { return self._s[2441]! } - public var Notifications_GroupNotificationsExceptionsHelp: String { return self._s[2442]! } + public var Watch_AuthRequired: String { return self._s[2437]! } + public var Conversation_EncryptedDescription1: String { return self._s[2438]! } + public var AppleWatch_ReplyPresets: String { return self._s[2439]! } + public var Channel_Members_AddAdminErrorNotAMember: String { return self._s[2440]! } + public var Conversation_EncryptedDescription2: String { return self._s[2441]! } + public var SocksProxySetup_HostnamePlaceholder: String { return self._s[2442]! } + public var NetworkUsageSettings_MediaVideoDataSection: String { return self._s[2443]! } + public var Paint_Edit: String { return self._s[2444]! } + public var Passport_Language_nl: String { return self._s[2445]! } + public var LastSeen_Offline: String { return self._s[2446]! } + public var Login_CodeFloodError: String { return self._s[2447]! } + public var Conversation_EncryptedDescription3: String { return self._s[2448]! } + public var Notifications_Badge_IncludePublicGroups: String { return self._s[2450]! } + public var Conversation_EncryptedDescription4: String { return self._s[2451]! } + public var AppleWatch_Title: String { return self._s[2453]! } + public var Contacts_AccessDeniedError: String { return self._s[2454]! } + public var Conversation_StatusTyping: String { return self._s[2455]! } + public var Share_Title: String { return self._s[2456]! } + public var TwoStepAuth_ConfirmationTitle: String { return self._s[2457]! } + public var Passport_Identity_FilesTitle: String { return self._s[2458]! } + public var ChatSettings_Title: String { return self._s[2459]! } + public var AuthSessions_CurrentSession: String { return self._s[2460]! } + public var Notifications_GroupNotificationsExceptionsHelp: String { return self._s[2461]! } public func Notification_RenamedChat(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2443]!, self._r[2443]!, [_0]) - } - public var Watch_Microphone_Access: String { return self._s[2444]! } - public var Watch_Conversation_GroupInfo: String { return self._s[2445]! } - public var Conversation_LiveLocation: String { return self._s[2446]! } - public var UserInfo_Title: String { return self._s[2448]! } - public var Passport_Language_fr: String { return self._s[2449]! } - public var Passport_Identity_DoesNotExpire: String { return self._s[2450]! } - public var Map_LiveLocationGroupDescription: String { return self._s[2451]! } - public var Login_InfoHelp: String { return self._s[2452]! } - public var ShareMenu_ShareTo: String { return self._s[2454]! } - public var Message_PinnedGame: String { return self._s[2458]! } - public var Channel_AdminLog_CanSendMessages: String { return self._s[2459]! } - public func AutoNightTheme_LocationHelp(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2460]!, self._r[2460]!, [_0, _1]) - } - public var Notification_RenamedGroup: String { return self._s[2461]! } - public func Call_PrivacyErrorMessage(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[2462]!, self._r[2462]!, [_0]) } - public var Passport_Address_Street: String { return self._s[2463]! } - public var Weekday_Thursday: String { return self._s[2464]! } - public var FastTwoStepSetup_HintPlaceholder: String { return self._s[2465]! } - public var PrivacySettings_DataSettings: String { return self._s[2466]! } - public var ChangePhoneNumberNumber_Title: String { return self._s[2467]! } - public var NotificationsSound_Bell: String { return self._s[2468]! } - public var Notifications_Badge_IncludeMutedChats: String { return self._s[2470]! } - public var TwoStepAuth_EnterPasswordInvalid: String { return self._s[2472]! } - public var DialogList_SearchSectionMessages: String { return self._s[2473]! } - public var Media_ShareThisVideo: String { return self._s[2474]! } - public var Call_ReportIncludeLogDescription: String { return self._s[2475]! } - public var Preview_DeleteGif: String { return self._s[2476]! } - public var Passport_Address_OneOfTypeTemporaryRegistration: String { return self._s[2477]! } - public var Weekday_Saturday: String { return self._s[2478]! } - public var UserInfo_DeleteContact: String { return self._s[2479]! } - public var Notifications_ResetAllNotifications: String { return self._s[2480]! } - public var SocksProxySetup_SaveProxy: String { return self._s[2481]! } - public var Passport_Identity_Country: String { return self._s[2482]! } - public var Notification_MessageLifetimeRemovedOutgoing: String { return self._s[2483]! } - public var Login_ContinueWithLocalization: String { return self._s[2484]! } - public var GroupInfo_AddParticipant: String { return self._s[2485]! } - public var Watch_Location_Current: String { return self._s[2486]! } - public var Checkout_NewCard_SaveInfoHelp: String { return self._s[2487]! } + public var Watch_Microphone_Access: String { return self._s[2463]! } + public var Watch_Conversation_GroupInfo: String { return self._s[2464]! } + public var Conversation_LiveLocation: String { return self._s[2465]! } + public var UserInfo_Title: String { return self._s[2467]! } + public var Passport_Language_fr: String { return self._s[2468]! } + public var Passport_Identity_DoesNotExpire: String { return self._s[2469]! } + public var Map_LiveLocationGroupDescription: String { return self._s[2470]! } + public var Login_InfoHelp: String { return self._s[2471]! } + public var ShareMenu_ShareTo: String { return self._s[2473]! } + public var Message_PinnedGame: String { return self._s[2477]! } + public var Channel_AdminLog_CanSendMessages: String { return self._s[2478]! } + public func AutoNightTheme_LocationHelp(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[2479]!, self._r[2479]!, [_0, _1]) + } + public var Notification_RenamedGroup: String { return self._s[2480]! } + public func Call_PrivacyErrorMessage(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[2481]!, self._r[2481]!, [_0]) + } + public var Passport_Address_Street: String { return self._s[2482]! } + public var Weekday_Thursday: String { return self._s[2483]! } + public var FastTwoStepSetup_HintPlaceholder: String { return self._s[2484]! } + public var PrivacySettings_DataSettings: String { return self._s[2485]! } + public var ChangePhoneNumberNumber_Title: String { return self._s[2486]! } + public var NotificationsSound_Bell: String { return self._s[2487]! } + public var Notifications_Badge_IncludeMutedChats: String { return self._s[2489]! } + public var TwoStepAuth_EnterPasswordInvalid: String { return self._s[2491]! } + public var DialogList_SearchSectionMessages: String { return self._s[2492]! } + public var Media_ShareThisVideo: String { return self._s[2493]! } + public var Call_ReportIncludeLogDescription: String { return self._s[2494]! } + public var Preview_DeleteGif: String { return self._s[2495]! } + public var Passport_Address_OneOfTypeTemporaryRegistration: String { return self._s[2496]! } + public var Weekday_Saturday: String { return self._s[2497]! } + public var UserInfo_DeleteContact: String { return self._s[2498]! } + public var Notifications_ResetAllNotifications: String { return self._s[2499]! } + public var SocksProxySetup_SaveProxy: String { return self._s[2500]! } + public var Passport_Identity_Country: String { return self._s[2501]! } + public var Notification_MessageLifetimeRemovedOutgoing: String { return self._s[2502]! } + public var Login_ContinueWithLocalization: String { return self._s[2503]! } + public var GroupInfo_AddParticipant: String { return self._s[2504]! } + public var Watch_Location_Current: String { return self._s[2505]! } + public var Checkout_NewCard_SaveInfoHelp: String { return self._s[2506]! } public func Settings_ApplyProxyAlertCredentials(_ _1: String, _ _2: String, _ _3: String, _ _4: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2490]!, self._r[2490]!, [_1, _2, _3, _4]) + return formatWithArgumentRanges(self._s[2509]!, self._r[2509]!, [_1, _2, _3, _4]) } - public var MediaPicker_CameraRoll: String { return self._s[2491]! } - public var Channel_AdminLog_CanPinMessages: String { return self._s[2492]! } - public var KeyCommand_NewMessage: String { return self._s[2493]! } + public var MediaPicker_CameraRoll: String { return self._s[2510]! } + public var Channel_AdminLog_CanPinMessages: String { return self._s[2511]! } + public var KeyCommand_NewMessage: String { return self._s[2512]! } public func ChannelInfo_AddParticipantConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2495]!, self._r[2495]!, [_0]) + return formatWithArgumentRanges(self._s[2514]!, self._r[2514]!, [_0]) } - public var NetworkUsageSettings_TotalSection: String { return self._s[2496]! } + public var NetworkUsageSettings_TotalSection: String { return self._s[2515]! } public func PINNED_AUDIO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2497]!, self._r[2497]!, [_1]) + return formatWithArgumentRanges(self._s[2516]!, self._r[2516]!, [_1]) } - public var Privacy_GroupsAndChannels: String { return self._s[2498]! } + public var Privacy_GroupsAndChannels: String { return self._s[2517]! } public func Time_PreciseDate_m12(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2500]!, self._r[2500]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[2519]!, self._r[2519]!, [_1, _2, _3]) } - public var Conversation_DiscardVoiceMessageDescription: String { return self._s[2503]! } - public var Passport_Address_ScansHelp: String { return self._s[2504]! } + public var Conversation_DiscardVoiceMessageDescription: String { return self._s[2522]! } + public var Passport_Address_ScansHelp: String { return self._s[2523]! } public func Notification_ChangedGroupPhoto(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2505]!, self._r[2505]!, [_0]) + return formatWithArgumentRanges(self._s[2524]!, self._r[2524]!, [_0]) } - public var TwoStepAuth_RemovePassword: String { return self._s[2507]! } - public var Privacy_GroupsAndChannels_CustomHelp: String { return self._s[2509]! } - public var Passport_Identity_Gender: String { return self._s[2510]! } - public var UserInfo_NotificationsDisable: String { return self._s[2511]! } - public var Watch_UserInfo_Service: String { return self._s[2512]! } - public var Privacy_Calls_CustomHelp: String { return self._s[2514]! } - public var ChangePhoneNumberCode_Code: String { return self._s[2515]! } - public var UserInfo_Invite: String { return self._s[2516]! } - public var CheckoutInfo_ErrorStateInvalid: String { return self._s[2517]! } - public var DialogList_ClearHistoryConfirmation: String { return self._s[2519]! } - public var CheckoutInfo_ErrorEmailInvalid: String { return self._s[2521]! } - public var Month_GenNovember: String { return self._s[2522]! } - public var UserInfo_NotificationsEnable: String { return self._s[2523]! } + public var TwoStepAuth_RemovePassword: String { return self._s[2526]! } + public var Privacy_GroupsAndChannels_CustomHelp: String { return self._s[2528]! } + public var Passport_Identity_Gender: String { return self._s[2529]! } + public var UserInfo_NotificationsDisable: String { return self._s[2530]! } + public var Watch_UserInfo_Service: String { return self._s[2531]! } + public var Privacy_Calls_CustomHelp: String { return self._s[2533]! } + public var ChangePhoneNumberCode_Code: String { return self._s[2534]! } + public var UserInfo_Invite: String { return self._s[2535]! } + public var CheckoutInfo_ErrorStateInvalid: String { return self._s[2536]! } + public var DialogList_ClearHistoryConfirmation: String { return self._s[2538]! } + public var CheckoutInfo_ErrorEmailInvalid: String { return self._s[2540]! } + public var Month_GenNovember: String { return self._s[2541]! } + public var UserInfo_NotificationsEnable: String { return self._s[2542]! } public func Target_InviteToGroupConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2525]!, self._r[2525]!, [_0]) + return formatWithArgumentRanges(self._s[2544]!, self._r[2544]!, [_0]) } - public var Map_Map: String { return self._s[2526]! } - public var Map_OpenInMaps: String { return self._s[2527]! } - public var Common_OK: String { return self._s[2528]! } - public var TwoStepAuth_SetupHintTitle: String { return self._s[2529]! } - public var GroupInfo_LeftStatus: String { return self._s[2530]! } - public var Cache_ClearProgress: String { return self._s[2531]! } - public var Login_InvalidPhoneError: String { return self._s[2532]! } - public var Passport_Authorize: String { return self._s[2533]! } - public var Cache_ClearEmpty: String { return self._s[2534]! } - public var Map_Search: String { return self._s[2535]! } - public var Passport_Identity_Translations: String { return self._s[2536]! } - public var ChannelMembers_GroupAdminsTitle: String { return self._s[2538]! } + public var Map_Map: String { return self._s[2545]! } + public var Map_OpenInMaps: String { return self._s[2546]! } + public var Common_OK: String { return self._s[2547]! } + public var TwoStepAuth_SetupHintTitle: String { return self._s[2548]! } + public var GroupInfo_LeftStatus: String { return self._s[2549]! } + public var Cache_ClearProgress: String { return self._s[2550]! } + public var Login_InvalidPhoneError: String { return self._s[2551]! } + public var Passport_Authorize: String { return self._s[2552]! } + public var Cache_ClearEmpty: String { return self._s[2553]! } + public var Map_Search: String { return self._s[2554]! } + public var Passport_Identity_Translations: String { return self._s[2555]! } + public var ChannelMembers_GroupAdminsTitle: String { return self._s[2557]! } public func Channel_AdminLog_MessageRemovedGroupUsername(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2539]!, self._r[2539]!, [_0]) + return formatWithArgumentRanges(self._s[2558]!, self._r[2558]!, [_0]) } public func ApplyLanguage_ChangeLanguageOfficialText(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2540]!, self._r[2540]!, [_1]) + return formatWithArgumentRanges(self._s[2559]!, self._r[2559]!, [_1]) } - public var ChatSettings_AutomaticPhotoDownload: String { return self._s[2541]! } - public var Group_ErrorAddTooMuchAdmins: String { return self._s[2543]! } - public var SocksProxySetup_Password: String { return self._s[2545]! } - public var Login_SelectCountry_Title: String { return self._s[2546]! } + public var ChatSettings_AutomaticPhotoDownload: String { return self._s[2560]! } + public var Group_ErrorAddTooMuchAdmins: String { return self._s[2562]! } + public var SocksProxySetup_Password: String { return self._s[2564]! } + public var Login_SelectCountry_Title: String { return self._s[2565]! } public func MESSAGE_PHOTOS(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2547]!, self._r[2547]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2566]!, self._r[2566]!, [_1, _2]) } - public var Notifications_GroupNotificationsHelp: String { return self._s[2548]! } - public var PhotoEditor_CropAspectRatioSquare: String { return self._s[2549]! } - public var Notification_CallOutgoing: String { return self._s[2550]! } - public var UserInfo_NotificationsDefault: String { return self._s[2551]! } - public var Weekday_ShortMonday: String { return self._s[2552]! } - public var Channel_Edit_AboutItem: String { return self._s[2553]! } - public var Checkout_Receipt_Title: String { return self._s[2554]! } - public var Login_InfoLastNamePlaceholder: String { return self._s[2555]! } - public var Channel_Members_AddMembersHelp: String { return self._s[2557]! } + public var Notifications_GroupNotificationsHelp: String { return self._s[2567]! } + public var PhotoEditor_CropAspectRatioSquare: String { return self._s[2568]! } + public var Notification_CallOutgoing: String { return self._s[2569]! } + public var UserInfo_NotificationsDefault: String { return self._s[2570]! } + public var Weekday_ShortMonday: String { return self._s[2571]! } + public var Channel_Edit_AboutItem: String { return self._s[2572]! } + public var Checkout_Receipt_Title: String { return self._s[2573]! } + public var Login_InfoLastNamePlaceholder: String { return self._s[2574]! } + public var Channel_Members_AddMembersHelp: String { return self._s[2576]! } public func MESSAGE_VIDEO_SECRET(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2558]!, self._r[2558]!, [_1]) + return formatWithArgumentRanges(self._s[2577]!, self._r[2577]!, [_1]) } - public var Settings_CopyPhoneNumber: String { return self._s[2559]! } - public var ReportPeer_Report: String { return self._s[2560]! } - public var Channel_EditMessageErrorGeneric: String { return self._s[2561]! } - public var Passport_Identity_TranslationsHelp: String { return self._s[2562]! } - public var LoginPassword_FloodError: String { return self._s[2563]! } - public var TwoStepAuth_SetupPasswordTitle: String { return self._s[2565]! } - public var PhotoEditor_DiscardChanges: String { return self._s[2566]! } - public var Group_UpgradeNoticeText2: String { return self._s[2567]! } + public var Settings_CopyPhoneNumber: String { return self._s[2578]! } + public var ReportPeer_Report: String { return self._s[2579]! } + public var Channel_EditMessageErrorGeneric: String { return self._s[2580]! } + public var Passport_Identity_TranslationsHelp: String { return self._s[2581]! } + public var LoginPassword_FloodError: String { return self._s[2582]! } + public var TwoStepAuth_SetupPasswordTitle: String { return self._s[2584]! } + public var PhotoEditor_DiscardChanges: String { return self._s[2585]! } + public var Group_UpgradeNoticeText2: String { return self._s[2586]! } public func PINNED_ROUND(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2568]!, self._r[2568]!, [_1]) + return formatWithArgumentRanges(self._s[2587]!, self._r[2587]!, [_1]) } public func ChannelInfo_ChannelForbidden(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2569]!, self._r[2569]!, [_0]) + return formatWithArgumentRanges(self._s[2588]!, self._r[2588]!, [_0]) } - public var Conversation_ShareMyContactInfo: String { return self._s[2570]! } - public var SocksProxySetup_UsernamePlaceholder: String { return self._s[2571]! } + public var Conversation_ShareMyContactInfo: String { return self._s[2589]! } + public var SocksProxySetup_UsernamePlaceholder: String { return self._s[2590]! } public func CHANNEL_MESSAGE_GEO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2572]!, self._r[2572]!, [_1]) + return formatWithArgumentRanges(self._s[2591]!, self._r[2591]!, [_1]) } - public var Contacts_PhoneNumber: String { return self._s[2573]! } - public var Group_Info_AdminLog: String { return self._s[2574]! } - public var Channel_AdminLogFilter_ChannelEventsInfo: String { return self._s[2575]! } - public var ChatSettings_AutoDownloadEnabled: String { return self._s[2576]! } - public var StickerPacksSettings_FeaturedPacks: String { return self._s[2577]! } - public var AuthSessions_LoggedIn: String { return self._s[2578]! } - public var Month_GenAugust: String { return self._s[2579]! } - public var Notification_CallCanceled: String { return self._s[2580]! } - public var Channel_Username_CreatePublicLinkHelp: String { return self._s[2581]! } - public var StickerPack_Send: String { return self._s[2582]! } - public var StickerSettings_MaskContextInfo: String { return self._s[2583]! } - public var Watch_Suggestion_HoldOn: String { return self._s[2584]! } + public var Contacts_PhoneNumber: String { return self._s[2592]! } + public var Group_Info_AdminLog: String { return self._s[2593]! } + public var Channel_AdminLogFilter_ChannelEventsInfo: String { return self._s[2594]! } + public var ChatSettings_AutoDownloadEnabled: String { return self._s[2595]! } + public var StickerPacksSettings_FeaturedPacks: String { return self._s[2596]! } + public var AuthSessions_LoggedIn: String { return self._s[2597]! } + public var Month_GenAugust: String { return self._s[2598]! } + public var Notification_CallCanceled: String { return self._s[2599]! } + public var Channel_Username_CreatePublicLinkHelp: String { return self._s[2600]! } + public var StickerPack_Send: String { return self._s[2601]! } + public var StickerSettings_MaskContextInfo: String { return self._s[2602]! } + public var Watch_Suggestion_HoldOn: String { return self._s[2603]! } public func PINNED_GEO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2585]!, self._r[2585]!, [_1]) + return formatWithArgumentRanges(self._s[2604]!, self._r[2604]!, [_1]) } - public var PasscodeSettings_EncryptData: String { return self._s[2586]! } - public var Common_NotNow: String { return self._s[2587]! } - public var FastTwoStepSetup_PasswordConfirmationPlaceholder: String { return self._s[2589]! } - public var PasscodeSettings_Title: String { return self._s[2590]! } - public var StickerPack_BuiltinPackName: String { return self._s[2591]! } - public var Appearance_AccentColor: String { return self._s[2593]! } - public var Watch_Suggestion_BRB: String { return self._s[2594]! } + public var PasscodeSettings_EncryptData: String { return self._s[2605]! } + public var Common_NotNow: String { return self._s[2606]! } + public var FastTwoStepSetup_PasswordConfirmationPlaceholder: String { return self._s[2608]! } + public var PasscodeSettings_Title: String { return self._s[2609]! } + public var StickerPack_BuiltinPackName: String { return self._s[2610]! } + public var Appearance_AccentColor: String { return self._s[2612]! } + public var Watch_Suggestion_BRB: String { return self._s[2613]! } public func CHAT_MESSAGE_ROUND(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2595]!, self._r[2595]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2614]!, self._r[2614]!, [_1, _2]) } - public var Notifications_MessageNotificationsAlert: String { return self._s[2596]! } - public var Username_InvalidCharacters: String { return self._s[2597]! } - public var GroupInfo_LabelAdmin: String { return self._s[2598]! } - public var GroupInfo_Sound: String { return self._s[2599]! } - public var Channel_EditAdmin_PermissionBanUsers: String { return self._s[2600]! } - public var InfoPlist_NSCameraUsageDescription: String { return self._s[2601]! } - public var Passport_Address_AddRentalAgreement: String { return self._s[2602]! } - public var Wallpaper_PhotoLibrary: String { return self._s[2603]! } - public var Settings_About: String { return self._s[2604]! } - public var Privacy_Calls_IntegrationHelp: String { return self._s[2605]! } - public var ContactInfo_Job: String { return self._s[2606]! } + public var Notifications_MessageNotificationsAlert: String { return self._s[2615]! } + public var Username_InvalidCharacters: String { return self._s[2616]! } + public var GroupInfo_LabelAdmin: String { return self._s[2617]! } + public var GroupInfo_Sound: String { return self._s[2618]! } + public var Channel_EditAdmin_PermissionBanUsers: String { return self._s[2619]! } + public var InfoPlist_NSCameraUsageDescription: String { return self._s[2620]! } + public var Passport_Address_AddRentalAgreement: String { return self._s[2621]! } + public var Wallpaper_PhotoLibrary: String { return self._s[2622]! } + public var Settings_About: String { return self._s[2623]! } + public var Privacy_Calls_IntegrationHelp: String { return self._s[2624]! } + public var ContactInfo_Job: String { return self._s[2625]! } public func CHAT_LEFT(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2607]!, self._r[2607]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2626]!, self._r[2626]!, [_1, _2]) } - public var LoginPassword_ForgotPassword: String { return self._s[2608]! } - public var Passport_Address_AddTemporaryRegistration: String { return self._s[2610]! } + public var LoginPassword_ForgotPassword: String { return self._s[2627]! } + public var Passport_Address_AddTemporaryRegistration: String { return self._s[2629]! } public func Map_LiveLocationShortHour(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2611]!, self._r[2611]!, [_0]) + return formatWithArgumentRanges(self._s[2630]!, self._r[2630]!, [_0]) } - public var Appearance_Preview: String { return self._s[2612]! } + public var Appearance_Preview: String { return self._s[2631]! } public func DialogList_AwaitingEncryption(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2613]!, self._r[2613]!, [_0]) - } - public var Passport_Identity_TypePassport: String { return self._s[2614]! } - public var ChatSettings_Appearance: String { return self._s[2615]! } - public var Tour_Title1: String { return self._s[2616]! } - public var Conversation_EditingCaptionPanelTitle: String { return self._s[2618]! } - public func Notifications_ExceptionsChangeSound(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2619]!, self._r[2619]!, [_0]) - } - public var Conversation_LinkDialogCopy: String { return self._s[2620]! } - public func Notification_PinnedLocationMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2621]!, self._r[2621]!, [_0]) - } - public func Notification_PinnedPhotoMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2622]!, self._r[2622]!, [_0]) - } - public func DownloadingStatus(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2623]!, self._r[2623]!, [_0, _1]) - } - public var Calls_All: String { return self._s[2624]! } - public func Channel_MessageTitleUpdated(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2625]!, self._r[2625]!, [_0]) - } - public var Call_CallAgain: String { return self._s[2626]! } - public var Message_VideoExpired: String { return self._s[2627]! } - public var TwoStepAuth_RecoveryCodeHelp: String { return self._s[2628]! } - public func Channel_AdminLog_MessagePromotedNameUsername(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2629]!, self._r[2629]!, [_1, _2]) - } - public var UserInfo_SendMessage: String { return self._s[2630]! } - public func Channel_Username_LinkHint(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2631]!, self._r[2631]!, [_0]) - } - public func AutoDownloadSettings_UpTo(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[2632]!, self._r[2632]!, [_0]) } - public var Settings_ViewPhoto: String { return self._s[2633]! } - public var Paint_RecentStickers: String { return self._s[2634]! } - public var TwoStepAuth_HintPlaceholder: String { return self._s[2635]! } + public var Passport_Identity_TypePassport: String { return self._s[2633]! } + public var ChatSettings_Appearance: String { return self._s[2634]! } + public var Tour_Title1: String { return self._s[2635]! } + public var Conversation_EditingCaptionPanelTitle: String { return self._s[2637]! } + public func Notifications_ExceptionsChangeSound(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[2638]!, self._r[2638]!, [_0]) + } + public var Conversation_LinkDialogCopy: String { return self._s[2639]! } + public func Notification_PinnedLocationMessage(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[2640]!, self._r[2640]!, [_0]) + } + public func Notification_PinnedPhotoMessage(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[2641]!, self._r[2641]!, [_0]) + } + public func DownloadingStatus(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[2642]!, self._r[2642]!, [_0, _1]) + } + public var Calls_All: String { return self._s[2643]! } + public func Channel_MessageTitleUpdated(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[2644]!, self._r[2644]!, [_0]) + } + public var Call_CallAgain: String { return self._s[2645]! } + public var Message_VideoExpired: String { return self._s[2646]! } + public var TwoStepAuth_RecoveryCodeHelp: String { return self._s[2647]! } + public func Channel_AdminLog_MessagePromotedNameUsername(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[2648]!, self._r[2648]!, [_1, _2]) + } + public var UserInfo_SendMessage: String { return self._s[2649]! } + public func Channel_Username_LinkHint(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[2650]!, self._r[2650]!, [_0]) + } + public func AutoDownloadSettings_UpTo(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[2651]!, self._r[2651]!, [_0]) + } + public var Settings_ViewPhoto: String { return self._s[2652]! } + public var Paint_RecentStickers: String { return self._s[2653]! } + public var TwoStepAuth_HintPlaceholder: String { return self._s[2654]! } public func Passport_PrivacyPolicy(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2636]!, self._r[2636]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2655]!, self._r[2655]!, [_1, _2]) } - public var ApplyLanguage_ApplyLanguageAction: String { return self._s[2637]! } - public var TwoStepAuth_EnabledSuccess: String { return self._s[2638]! } - public var Login_CallRequestState3: String { return self._s[2639]! } - public var Channel_Edit_LinkItem: String { return self._s[2640]! } - public var CallSettings_Title: String { return self._s[2642]! } - public var ChangePhoneNumberNumber_Help: String { return self._s[2643]! } - public var Passport_InfoTitle: String { return self._s[2644]! } - public var Watch_Suggestion_Thanks: String { return self._s[2645]! } - public var Channel_Moderator_Title: String { return self._s[2646]! } - public var Message_PinnedPhotoMessage: String { return self._s[2647]! } - public var Notification_SecretChatScreenshot: String { return self._s[2648]! } + public var ApplyLanguage_ApplyLanguageAction: String { return self._s[2656]! } + public var TwoStepAuth_EnabledSuccess: String { return self._s[2657]! } + public var Login_CallRequestState3: String { return self._s[2658]! } + public var Channel_Edit_LinkItem: String { return self._s[2659]! } + public var CallSettings_Title: String { return self._s[2661]! } + public var ChangePhoneNumberNumber_Help: String { return self._s[2662]! } + public var Passport_InfoTitle: String { return self._s[2663]! } + public var Watch_Suggestion_Thanks: String { return self._s[2664]! } + public var Channel_Moderator_Title: String { return self._s[2665]! } + public var Message_PinnedPhotoMessage: String { return self._s[2666]! } + public var Notification_SecretChatScreenshot: String { return self._s[2667]! } public func Conversation_DeleteMessagesFor(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2649]!, self._r[2649]!, [_0]) + return formatWithArgumentRanges(self._s[2668]!, self._r[2668]!, [_0]) } - public var Activity_UploadingDocument: String { return self._s[2650]! } - public var Watch_ChatList_NoConversationsText: String { return self._s[2651]! } - public var ReportPeer_AlertSuccess: String { return self._s[2652]! } - public var Tour_Text4: String { return self._s[2653]! } - public var Channel_Info_Description: String { return self._s[2654]! } - public var AccessDenied_LocationTracking: String { return self._s[2656]! } - public var Watch_Compose_Send: String { return self._s[2657]! } - public var SocksProxySetup_UseForCallsHelp: String { return self._s[2658]! } - public var Preview_CopyAddress: String { return self._s[2659]! } - public var Settings_BlockedUsers: String { return self._s[2660]! } - public var Month_ShortAugust: String { return self._s[2661]! } - public var Passport_Identity_MainPage: String { return self._s[2662]! } - public var Passport_FieldAddress: String { return self._s[2664]! } - public var Channel_AdminLogFilter_AdminsTitle: String { return self._s[2665]! } - public var Channel_EditAdmin_PermissionChangeInfo: String { return self._s[2666]! } - public var Notifications_ResetAllNotificationsHelp: String { return self._s[2667]! } - public var DialogList_EncryptionRejected: String { return self._s[2668]! } - public var Target_InviteToGroupErrorAlreadyInvited: String { return self._s[2670]! } - public var AccessDenied_CameraRestricted: String { return self._s[2671]! } - public var Watch_Message_ForwardedFrom: String { return self._s[2672]! } - public var CheckoutInfo_ShippingInfoCountryPlaceholder: String { return self._s[2674]! } - public var Channel_AboutItem: String { return self._s[2675]! } - public var PhotoEditor_CurvesGreen: String { return self._s[2676]! } - public var Month_GenJuly: String { return self._s[2677]! } - public var ContactInfo_URLLabelHomepage: String { return self._s[2678]! } - public var PrivacyPolicy_DeclineDeclineAndDelete: String { return self._s[2679]! } + public var Activity_UploadingDocument: String { return self._s[2669]! } + public var Watch_ChatList_NoConversationsText: String { return self._s[2670]! } + public var ReportPeer_AlertSuccess: String { return self._s[2671]! } + public var Tour_Text4: String { return self._s[2672]! } + public var Channel_Info_Description: String { return self._s[2673]! } + public var AccessDenied_LocationTracking: String { return self._s[2675]! } + public var Watch_Compose_Send: String { return self._s[2676]! } + public var SocksProxySetup_UseForCallsHelp: String { return self._s[2677]! } + public var Preview_CopyAddress: String { return self._s[2678]! } + public var Settings_BlockedUsers: String { return self._s[2679]! } + public var Month_ShortAugust: String { return self._s[2680]! } + public var Passport_Identity_MainPage: String { return self._s[2681]! } + public var Passport_FieldAddress: String { return self._s[2683]! } + public var Channel_AdminLogFilter_AdminsTitle: String { return self._s[2684]! } + public var Channel_EditAdmin_PermissionChangeInfo: String { return self._s[2685]! } + public var Notifications_ResetAllNotificationsHelp: String { return self._s[2686]! } + public var DialogList_EncryptionRejected: String { return self._s[2687]! } + public var Target_InviteToGroupErrorAlreadyInvited: String { return self._s[2689]! } + public var AccessDenied_CameraRestricted: String { return self._s[2690]! } + public var Watch_Message_ForwardedFrom: String { return self._s[2691]! } + public var CheckoutInfo_ShippingInfoCountryPlaceholder: String { return self._s[2693]! } + public var Channel_AboutItem: String { return self._s[2694]! } + public var PhotoEditor_CurvesGreen: String { return self._s[2695]! } + public var Month_GenJuly: String { return self._s[2696]! } + public var ContactInfo_URLLabelHomepage: String { return self._s[2697]! } + public var PrivacyPolicy_DeclineDeclineAndDelete: String { return self._s[2698]! } public func DialogList_SingleUploadingFileSuffix(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2681]!, self._r[2681]!, [_0]) + return formatWithArgumentRanges(self._s[2700]!, self._r[2700]!, [_0]) } - public var ChannelIntro_CreateChannel: String { return self._s[2683]! } - public var Channel_Management_AddModerator: String { return self._s[2684]! } - public var Common_ChoosePhoto: String { return self._s[2685]! } - public var Conversation_Pin: String { return self._s[2686]! } + public var ChannelIntro_CreateChannel: String { return self._s[2702]! } + public var Channel_Management_AddModerator: String { return self._s[2703]! } + public var Common_ChoosePhoto: String { return self._s[2704]! } + public var Conversation_Pin: String { return self._s[2705]! } public func Login_ResetAccountProtected_Text(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2688]!, self._r[2688]!, [_0]) + return formatWithArgumentRanges(self._s[2707]!, self._r[2707]!, [_0]) } public func Channel_AdminLog_EmptyFilterQueryText(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2689]!, self._r[2689]!, [_0]) + return formatWithArgumentRanges(self._s[2708]!, self._r[2708]!, [_0]) } - public var Camera_TapAndHoldForVideo: String { return self._s[2690]! } - public var Notification_Exceptions_AlwaysOn: String { return self._s[2691]! } - public var Bot_DescriptionTitle: String { return self._s[2692]! } - public var FeaturedStickerPacks_Title: String { return self._s[2693]! } - public var Map_OpenInGoogleMaps: String { return self._s[2695]! } - public var Notification_MessageLifetime5s: String { return self._s[2696]! } - public var Contacts_Title: String { return self._s[2699]! } - public var TwoStepAuth_DisableSuccess: String { return self._s[2700]! } + public var Camera_TapAndHoldForVideo: String { return self._s[2709]! } + public var Notification_Exceptions_AlwaysOn: String { return self._s[2710]! } + public var Bot_DescriptionTitle: String { return self._s[2711]! } + public var FeaturedStickerPacks_Title: String { return self._s[2712]! } + public var Map_OpenInGoogleMaps: String { return self._s[2714]! } + public var Notification_MessageLifetime5s: String { return self._s[2715]! } + public var Contacts_Title: String { return self._s[2718]! } + public var TwoStepAuth_DisableSuccess: String { return self._s[2719]! } public func MESSAGES(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2701]!, self._r[2701]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2720]!, self._r[2720]!, [_1, _2]) } - public var Channel_Management_AddModeratorHelp: String { return self._s[2704]! } + public var Channel_Management_AddModeratorHelp: String { return self._s[2723]! } + public var Permissions_NotificationsAllowInSettings: String { return self._s[2724]! } public func CHAT_MESSAGE_FWDS(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2705]!, self._r[2705]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[2725]!, self._r[2725]!, [_1, _2, _3]) } - public var Conversation_MessageDialogEdit: String { return self._s[2706]! } - public var PrivacyLastSeenSettings_Title: String { return self._s[2707]! } - public var Notifications_ClassicTones: String { return self._s[2709]! } - public var Conversation_LinkDialogOpen: String { return self._s[2710]! } - public var Channel_Info_Subscribers: String { return self._s[2711]! } - public var NotificationsSound_Input: String { return self._s[2712]! } - public var Conversation_ClousStorageInfo_Description4: String { return self._s[2713]! } - public var Privacy_Calls_AlwaysAllow: String { return self._s[2714]! } - public var Privacy_PaymentsClearInfoHelp: String { return self._s[2716]! } - public var Notification_MessageLifetime1h: String { return self._s[2717]! } + public var Conversation_MessageDialogEdit: String { return self._s[2726]! } + public var PrivacyLastSeenSettings_Title: String { return self._s[2727]! } + public var Notifications_ClassicTones: String { return self._s[2729]! } + public var Conversation_LinkDialogOpen: String { return self._s[2730]! } + public var Channel_Info_Subscribers: String { return self._s[2731]! } + public var NotificationsSound_Input: String { return self._s[2732]! } + public var Conversation_ClousStorageInfo_Description4: String { return self._s[2733]! } + public var Privacy_Calls_AlwaysAllow: String { return self._s[2734]! } + public var Privacy_PaymentsClearInfoHelp: String { return self._s[2736]! } + public var Notification_MessageLifetime1h: String { return self._s[2737]! } public func Notification_CreatedChatWithTitle(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2718]!, self._r[2718]!, [_0, _1]) + return formatWithArgumentRanges(self._s[2738]!, self._r[2738]!, [_0, _1]) } - public var CheckoutInfo_ReceiverInfoEmail: String { return self._s[2719]! } - public var LastSeen_Lately: String { return self._s[2720]! } - public var Month_ShortApril: String { return self._s[2721]! } - public var ConversationProfile_ErrorCreatingConversation: String { return self._s[2722]! } + public var CheckoutInfo_ReceiverInfoEmail: String { return self._s[2739]! } + public var LastSeen_Lately: String { return self._s[2740]! } + public var Month_ShortApril: String { return self._s[2741]! } + public var ConversationProfile_ErrorCreatingConversation: String { return self._s[2742]! } public func PHONE_CALL_MISSED(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2723]!, self._r[2723]!, [_1]) + return formatWithArgumentRanges(self._s[2743]!, self._r[2743]!, [_1]) } public func Conversation_Kilobytes(_ _0: Int) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2724]!, self._r[2724]!, ["\(_0)"]) + return formatWithArgumentRanges(self._s[2744]!, self._r[2744]!, ["\(_0)"]) } - public var Group_ErrorAddBlocked: String { return self._s[2725]! } - public var TwoStepAuth_AdditionalPassword: String { return self._s[2727]! } - public var MediaPicker_Videos: String { return self._s[2728]! } - public var Notification_PassportValueProofOfIdentity: String { return self._s[2729]! } - public var BlockedUsers_AddNew: String { return self._s[2730]! } - public var StickerPacksSettings_StickerPacksSection: String { return self._s[2731]! } - public var Channel_NotificationLoading: String { return self._s[2732]! } - public var Passport_Language_da: String { return self._s[2734]! } - public var Passport_Address_Country: String { return self._s[2735]! } + public var Group_ErrorAddBlocked: String { return self._s[2745]! } + public var TwoStepAuth_AdditionalPassword: String { return self._s[2747]! } + public var MediaPicker_Videos: String { return self._s[2748]! } + public var Notification_PassportValueProofOfIdentity: String { return self._s[2749]! } + public var BlockedUsers_AddNew: String { return self._s[2750]! } + public var StickerPacksSettings_StickerPacksSection: String { return self._s[2751]! } + public var Channel_NotificationLoading: String { return self._s[2752]! } + public var Passport_Language_da: String { return self._s[2754]! } + public var Passport_Address_Country: String { return self._s[2755]! } public func CHAT_RETURNED(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2736]!, self._r[2736]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2756]!, self._r[2756]!, [_1, _2]) } - public var PhotoEditor_ShadowsTint: String { return self._s[2738]! } - public var ExplicitContent_AlertTitle: String { return self._s[2740]! } - public var Channel_AdminLogFilter_EventsLeaving: String { return self._s[2741]! } - public var Map_LiveLocationFor8Hours: String { return self._s[2742]! } - public var StickerPack_HideStickers: String { return self._s[2743]! } - public var Checkout_EnterPassword: String { return self._s[2744]! } - public var UserInfo_NotificationsEnabled: String { return self._s[2745]! } - public var InfoPlist_NSLocationAlwaysUsageDescription: String { return self._s[2746]! } - public var SocksProxySetup_ProxyDetailsTitle: String { return self._s[2747]! } - public var Appearance_ReduceMotionInfo: String { return self._s[2748]! } - public var Weekday_ShortTuesday: String { return self._s[2749]! } - public var Notification_CallIncomingShort: String { return self._s[2750]! } - public var ConvertToSupergroup_Note: String { return self._s[2751]! } - public var Login_SendCodeViaSms: String { return self._s[2752]! } - public var DialogList_Read: String { return self._s[2753]! } - public var Conversation_EmptyPlaceholder: String { return self._s[2754]! } + public var PhotoEditor_ShadowsTint: String { return self._s[2758]! } + public var ExplicitContent_AlertTitle: String { return self._s[2760]! } + public var Channel_AdminLogFilter_EventsLeaving: String { return self._s[2761]! } + public var Map_LiveLocationFor8Hours: String { return self._s[2762]! } + public var StickerPack_HideStickers: String { return self._s[2763]! } + public var Checkout_EnterPassword: String { return self._s[2764]! } + public var UserInfo_NotificationsEnabled: String { return self._s[2765]! } + public var InfoPlist_NSLocationAlwaysUsageDescription: String { return self._s[2766]! } + public var SocksProxySetup_ProxyDetailsTitle: String { return self._s[2767]! } + public var Appearance_ReduceMotionInfo: String { return self._s[2768]! } + public var Weekday_ShortTuesday: String { return self._s[2769]! } + public var Notification_CallIncomingShort: String { return self._s[2770]! } + public var ConvertToSupergroup_Note: String { return self._s[2771]! } + public var Login_SendCodeViaSms: String { return self._s[2772]! } + public var DialogList_Read: String { return self._s[2773]! } + public var Conversation_EmptyPlaceholder: String { return self._s[2774]! } public func Passport_Email_CodeHelp(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2755]!, self._r[2755]!, [_0]) + return formatWithArgumentRanges(self._s[2775]!, self._r[2775]!, [_0]) } - public var Username_Help: String { return self._s[2756]! } - public var StickerSettings_ContextHide: String { return self._s[2757]! } - public var Media_ShareThisPhoto: String { return self._s[2760]! } - public var Contacts_ShareTelegram: String { return self._s[2761]! } - public var AutoNightTheme_Scheduled: String { return self._s[2762]! } - public var Weekday_Sunday: String { return self._s[2763]! } - public var PrivacySettings_PasscodeAndFaceId: String { return self._s[2765]! } - public var Settings_ChatBackground: String { return self._s[2766]! } - public var Login_TermsOfServiceDecline: String { return self._s[2768]! } - public func ServiceMessage_GameScoreExtended(_ value: Int32) -> String { + public var Username_Help: String { return self._s[2776]! } + public var StickerSettings_ContextHide: String { return self._s[2777]! } + public var Media_ShareThisPhoto: String { return self._s[2780]! } + public var Contacts_ShareTelegram: String { return self._s[2781]! } + public var AutoNightTheme_Scheduled: String { return self._s[2782]! } + public var Weekday_Sunday: String { return self._s[2783]! } + public var PrivacySettings_PasscodeAndFaceId: String { return self._s[2785]! } + public var Settings_ChatBackground: String { return self._s[2786]! } + public var Login_TermsOfServiceDecline: String { return self._s[2788]! } + public func StickerPack_RemoveMaskCount(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) return String(format: self._ps[0 * 6 + Int(form.rawValue)]!, "\(value)") } - public func ForwardedStickers(_ value: Int32) -> String { + public func MessageTimer_ShortSeconds(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) return String(format: self._ps[1 * 6 + Int(form.rawValue)]!, "\(value)") } - public func StickerPack_AddMaskCount(_ value: Int32) -> String { + public func SharedMedia_Generic(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) return String(format: self._ps[2 * 6 + Int(form.rawValue)]!, "\(value)") } - public func MuteExpires_Days(_ value: Int32) -> String { + public func MuteExpires_Hours(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) return String(format: self._ps[3 * 6 + Int(form.rawValue)]!, "\(value)") } - public func MessageTimer_Hours(_ value: Int32) -> String { + public func LiveLocation_MenuChatsCount(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) return String(format: self._ps[4 * 6 + Int(form.rawValue)]!, "\(value)") } - public func PasscodeSettings_FailedAttempts(_ value: Int32) -> String { + public func MessageTimer_Weeks(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) return String(format: self._ps[5 * 6 + Int(form.rawValue)]!, "\(value)") } - public func MessageTimer_ShortMinutes(_ value: Int32) -> String { + public func Conversation_StatusMembers(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) return String(format: self._ps[6 * 6 + Int(form.rawValue)]!, "\(value)") } - public func SharedMedia_File(_ value: Int32) -> String { + public func AttachmentMenu_SendGif(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) return String(format: self._ps[7 * 6 + Int(form.rawValue)]!, "\(value)") } - public func Passport_Scans(_ value: Int32) -> String { + public func MuteFor_Days(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) return String(format: self._ps[8 * 6 + Int(form.rawValue)]!, "\(value)") } - public func Call_ShortMinutes(_ value: Int32) -> String { + public func ForwardedLocations(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) return String(format: self._ps[9 * 6 + Int(form.rawValue)]!, "\(value)") } - public func Media_SharePhoto(_ value: Int32) -> String { + public func ForwardedVideos(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) return String(format: self._ps[10 * 6 + Int(form.rawValue)]!, "\(value)") } - public func LiveLocationUpdated_MinutesAgo(_ value: Int32) -> String { + public func StickerPack_RemoveStickerCount(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) return String(format: self._ps[11 * 6 + Int(form.rawValue)]!, "\(value)") } - public func Call_Minutes(_ value: Int32) -> String { + public func Forward_ConfirmMultipleFiles(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) return String(format: self._ps[12 * 6 + Int(form.rawValue)]!, "\(value)") } - public func ForwardedPhotos(_ value: Int32) -> String { + public func ForwardedMessages(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) return String(format: self._ps[13 * 6 + Int(form.rawValue)]!, "\(value)") } - public func MessageTimer_ShortWeeks(_ value: Int32) -> String { + public func AttachmentMenu_SendPhoto(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) return String(format: self._ps[14 * 6 + Int(form.rawValue)]!, "\(value)") } - public func PrivacyLastSeenSettings_AddUsers(_ value: Int32) -> String { + public func LastSeen_HoursAgo(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) return String(format: self._ps[15 * 6 + Int(form.rawValue)]!, "\(value)") } - public func QuickSend_Photos(_ value: Int32) -> String { + public func Conversation_LiveLocationMembersCount(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) return String(format: self._ps[16 * 6 + Int(form.rawValue)]!, "\(value)") } - public func Conversation_LiveLocationMembersCount(_ value: Int32) -> String { + public func ForwardedStickers(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) return String(format: self._ps[17 * 6 + Int(form.rawValue)]!, "\(value)") } - public func MessageTimer_Months(_ value: Int32) -> String { + public func QuickSend_Photos(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) return String(format: self._ps[18 * 6 + Int(form.rawValue)]!, "\(value)") } - public func Notification_GameScoreSelfSimple(_ value: Int32) -> String { + public func ServiceMessage_GameScoreSelfSimple(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) return String(format: self._ps[19 * 6 + Int(form.rawValue)]!, "\(value)") } - public func ForwardedGifs(_ value: Int32) -> String { + public func ForwardedContacts(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) return String(format: self._ps[20 * 6 + Int(form.rawValue)]!, "\(value)") } - public func StickerPack_RemoveMaskCount(_ value: Int32) -> String { + public func MessageTimer_ShortWeeks(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) return String(format: self._ps[21 * 6 + Int(form.rawValue)]!, "\(value)") } - public func Media_ShareVideo(_ value: Int32) -> String { + public func MuteExpires_Days(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) return String(format: self._ps[22 * 6 + Int(form.rawValue)]!, "\(value)") } - public func Notifications_ExceptionMuteExpires_Minutes(_ value: Int32) -> String { + public func SharedMedia_DeleteItemsConfirmation(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) return String(format: self._ps[23 * 6 + Int(form.rawValue)]!, "\(value)") } - public func Conversation_StatusOnline(_ value: Int32) -> String { + public func SharedMedia_Photo(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) return String(format: self._ps[24 * 6 + Int(form.rawValue)]!, "\(value)") } - public func Notifications_ExceptionMuteExpires_Hours(_ value: Int32) -> String { + public func MessageTimer_ShortDays(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) return String(format: self._ps[25 * 6 + Int(form.rawValue)]!, "\(value)") } - public func MessageTimer_Days(_ value: Int32) -> String { + public func ForwardedVideoMessages(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) return String(format: self._ps[26 * 6 + Int(form.rawValue)]!, "\(value)") } - public func ForwardedMessages(_ value: Int32) -> String { + public func Call_Minutes(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) return String(format: self._ps[27 * 6 + Int(form.rawValue)]!, "\(value)") } - public func GroupInfo_ParticipantCount(_ value: Int32) -> String { + public func Map_ETAHours(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) return String(format: self._ps[28 * 6 + Int(form.rawValue)]!, "\(value)") } - public func Call_Seconds(_ value: Int32) -> String { + public func Notifications_ExceptionMuteExpires_Days(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) return String(format: self._ps[29 * 6 + Int(form.rawValue)]!, "\(value)") } - public func StickerPack_RemoveStickerCount(_ value: Int32) -> String { + public func Notifications_Exceptions(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) return String(format: self._ps[30 * 6 + Int(form.rawValue)]!, "\(value)") } - public func ServiceMessage_GameScoreSelfSimple(_ value: Int32) -> String { + public func MuteFor_Hours(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) return String(format: self._ps[31 * 6 + Int(form.rawValue)]!, "\(value)") } - public func StickerPack_StickerCount(_ value: Int32) -> String { + public func Map_ETAMinutes(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) return String(format: self._ps[32 * 6 + Int(form.rawValue)]!, "\(value)") } - public func InviteText_ContactsCountText(_ value: Int32) -> String { + public func LiveLocationUpdated_MinutesAgo(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) return String(format: self._ps[33 * 6 + Int(form.rawValue)]!, "\(value)") } @@ -3265,191 +3285,191 @@ public final class PresentationStrings { let form = presentationStringsPluralizationForm(self.lc, value) return String(format: self._ps[34 * 6 + Int(form.rawValue)]!, "\(value)") } - public func SharedMedia_Generic(_ value: Int32) -> String { + public func Media_ShareVideo(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) return String(format: self._ps[35 * 6 + Int(form.rawValue)]!, "\(value)") } - public func Notifications_ExceptionMuteExpires_Days(_ value: Int32) -> String { + public func ServiceMessage_GameScoreSelfExtended(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) return String(format: self._ps[36 * 6 + Int(form.rawValue)]!, "\(value)") } - public func AttachmentMenu_SendGif(_ value: Int32) -> String { + public func MessageTimer_ShortMinutes(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) return String(format: self._ps[37 * 6 + Int(form.rawValue)]!, "\(value)") } - public func MessageTimer_Minutes(_ value: Int32) -> String { + public func ServiceMessage_GameScoreSimple(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) return String(format: self._ps[38 * 6 + Int(form.rawValue)]!, "\(value)") } - public func MuteFor_Days(_ value: Int32) -> String { + public func MessageTimer_Months(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) return String(format: self._ps[39 * 6 + Int(form.rawValue)]!, "\(value)") } - public func MessageTimer_ShortSeconds(_ value: Int32) -> String { + public func ForwardedAuthorsOthers(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) return String(format: self._ps[40 * 6 + Int(form.rawValue)]!, "\(value)") } - public func SharedMedia_DeleteItemsConfirmation(_ value: Int32) -> String { + public func DialogList_LiveLocationChatsCount(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) return String(format: self._ps[41 * 6 + Int(form.rawValue)]!, "\(value)") } - public func SharedMedia_Link(_ value: Int32) -> String { + public func MessageTimer_Minutes(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) return String(format: self._ps[42 * 6 + Int(form.rawValue)]!, "\(value)") } - public func ForwardedContacts(_ value: Int32) -> String { + public func Notification_GameScoreSimple(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) return String(format: self._ps[43 * 6 + Int(form.rawValue)]!, "\(value)") } - public func MuteExpires_Minutes(_ value: Int32) -> String { + public func Notification_GameScoreSelfExtended(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) return String(format: self._ps[44 * 6 + Int(form.rawValue)]!, "\(value)") } - public func Media_ShareItem(_ value: Int32) -> String { + public func Watch_LastSeen_HoursAgo(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) return String(format: self._ps[45 * 6 + Int(form.rawValue)]!, "\(value)") } - public func Forward_ConfirmMultipleFiles(_ value: Int32) -> String { + public func LastSeen_MinutesAgo(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) return String(format: self._ps[46 * 6 + Int(form.rawValue)]!, "\(value)") } - public func ForwardedVideos(_ value: Int32) -> String { + public func Call_ShortSeconds(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) return String(format: self._ps[47 * 6 + Int(form.rawValue)]!, "\(value)") } - public func MessageTimer_Weeks(_ value: Int32) -> String { + public func Media_SharePhoto(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) return String(format: self._ps[48 * 6 + Int(form.rawValue)]!, "\(value)") } - public func Notification_GameScoreSimple(_ value: Int32) -> String { + public func ServiceMessage_GameScoreExtended(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) return String(format: self._ps[49 * 6 + Int(form.rawValue)]!, "\(value)") } - public func ServiceMessage_GameScoreSimple(_ value: Int32) -> String { + public func Call_ShortMinutes(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) return String(format: self._ps[50 * 6 + Int(form.rawValue)]!, "\(value)") } - public func Notification_GameScoreSelfExtended(_ value: Int32) -> String { + public func MuteExpires_Minutes(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) return String(format: self._ps[51 * 6 + Int(form.rawValue)]!, "\(value)") } - public func MessageTimer_Years(_ value: Int32) -> String { + public func ForwardedAudios(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) return String(format: self._ps[52 * 6 + Int(form.rawValue)]!, "\(value)") } - public func SharedMedia_Photo(_ value: Int32) -> String { + public func ForwardedFiles(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) return String(format: self._ps[53 * 6 + Int(form.rawValue)]!, "\(value)") } - public func MuteFor_Hours(_ value: Int32) -> String { + public func StickerPack_AddStickerCount(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) return String(format: self._ps[54 * 6 + Int(form.rawValue)]!, "\(value)") } - public func Map_ETAMinutes(_ value: Int32) -> String { + public func Watch_LastSeen_MinutesAgo(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) return String(format: self._ps[55 * 6 + Int(form.rawValue)]!, "\(value)") } - public func ForwardedAudios(_ value: Int32) -> String { + public func MessageTimer_Hours(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) return String(format: self._ps[56 * 6 + Int(form.rawValue)]!, "\(value)") } - public func MessageTimer_Seconds(_ value: Int32) -> String { + public func SharedMedia_File(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) return String(format: self._ps[57 * 6 + Int(form.rawValue)]!, "\(value)") } - public func ForwardedFiles(_ value: Int32) -> String { + public func Notifications_ExceptionMuteExpires_Minutes(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) return String(format: self._ps[58 * 6 + Int(form.rawValue)]!, "\(value)") } - public func AttachmentMenu_SendItem(_ value: Int32) -> String { + public func AttachmentMenu_SendVideo(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) return String(format: self._ps[59 * 6 + Int(form.rawValue)]!, "\(value)") } - public func ForwardedVideoMessages(_ value: Int32) -> String { + public func MessageTimer_ShortHours(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) return String(format: self._ps[60 * 6 + Int(form.rawValue)]!, "\(value)") } - public func LiveLocation_MenuChatsCount(_ value: Int32) -> String { + public func SharedMedia_Video(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) return String(format: self._ps[61 * 6 + Int(form.rawValue)]!, "\(value)") } - public func SharedMedia_Video(_ value: Int32) -> String { + public func Call_Seconds(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) return String(format: self._ps[62 * 6 + Int(form.rawValue)]!, "\(value)") } - public func Conversation_StatusSubscribers(_ value: Int32) -> String { + public func MessageTimer_Seconds(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) return String(format: self._ps[63 * 6 + Int(form.rawValue)]!, "\(value)") } - public func Conversation_StatusMembers(_ value: Int32) -> String { + public func Conversation_StatusSubscribers(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) return String(format: self._ps[64 * 6 + Int(form.rawValue)]!, "\(value)") } - public func StickerPack_AddStickerCount(_ value: Int32) -> String { + public func Notification_GameScoreSelfSimple(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) return String(format: self._ps[65 * 6 + Int(form.rawValue)]!, "\(value)") } - public func Watch_LastSeen_MinutesAgo(_ value: Int32) -> String { + public func SharedMedia_Link(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) return String(format: self._ps[66 * 6 + Int(form.rawValue)]!, "\(value)") } - public func LastSeen_MinutesAgo(_ value: Int32) -> String { + public func StickerPack_AddMaskCount(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) return String(format: self._ps[67 * 6 + Int(form.rawValue)]!, "\(value)") } - public func AttachmentMenu_SendPhoto(_ value: Int32) -> String { + public func MessageTimer_Years(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) return String(format: self._ps[68 * 6 + Int(form.rawValue)]!, "\(value)") } - public func Contacts_ImportersCount(_ value: Int32) -> String { + public func GroupInfo_ParticipantCount(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) return String(format: self._ps[69 * 6 + Int(form.rawValue)]!, "\(value)") } - public func Map_ETAHours(_ value: Int32) -> String { + public func ForwardedPhotos(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) return String(format: self._ps[70 * 6 + Int(form.rawValue)]!, "\(value)") } - public func Watch_LastSeen_HoursAgo(_ value: Int32) -> String { + public func UserCount(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) return String(format: self._ps[71 * 6 + Int(form.rawValue)]!, "\(value)") } - public func ServiceMessage_GameScoreSelfExtended(_ value: Int32) -> String { + public func MessageTimer_Days(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) return String(format: self._ps[72 * 6 + Int(form.rawValue)]!, "\(value)") } - public func MuteExpires_Hours(_ value: Int32) -> String { + public func PasscodeSettings_FailedAttempts(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) return String(format: self._ps[73 * 6 + Int(form.rawValue)]!, "\(value)") } - public func UserCount(_ value: Int32) -> String { + public func PrivacyLastSeenSettings_AddUsers(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) return String(format: self._ps[74 * 6 + Int(form.rawValue)]!, "\(value)") } - public func MessageTimer_ShortHours(_ value: Int32) -> String { + public func StickerPack_StickerCount(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) return String(format: self._ps[75 * 6 + Int(form.rawValue)]!, "\(value)") } - public func ForwardedAuthorsOthers(_ value: Int32) -> String { + public func Contacts_ImportersCount(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) return String(format: self._ps[76 * 6 + Int(form.rawValue)]!, "\(value)") } - public func Call_ShortSeconds(_ value: Int32) -> String { + public func Passport_Scans(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) return String(format: self._ps[77 * 6 + Int(form.rawValue)]!, "\(value)") } - public func LastSeen_HoursAgo(_ value: Int32) -> String { + public func InviteText_ContactsCountText(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) return String(format: self._ps[78 * 6 + Int(form.rawValue)]!, "\(value)") } - public func DialogList_LiveLocationChatsCount(_ value: Int32) -> String { + public func Media_ShareItem(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) return String(format: self._ps[79 * 6 + Int(form.rawValue)]!, "\(value)") } - public func MessageTimer_ShortDays(_ value: Int32) -> String { + public func Notifications_ExceptionMuteExpires_Hours(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) return String(format: self._ps[80 * 6 + Int(form.rawValue)]!, "\(value)") } - public func Invitation_Members(_ value: Int32) -> String { + public func AttachmentMenu_SendItem(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) return String(format: self._ps[81 * 6 + Int(form.rawValue)]!, "\(value)") } @@ -3457,15 +3477,15 @@ public final class PresentationStrings { let form = presentationStringsPluralizationForm(self.lc, value) return String(format: self._ps[82 * 6 + Int(form.rawValue)]!, "\(value)") } - public func AttachmentMenu_SendVideo(_ value: Int32) -> String { + public func Invitation_Members(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) return String(format: self._ps[83 * 6 + Int(form.rawValue)]!, "\(value)") } - public func ForwardedLocations(_ value: Int32) -> String { + public func ForwardedGifs(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) return String(format: self._ps[84 * 6 + Int(form.rawValue)]!, "\(value)") } - public func Notifications_Exceptions(_ value: Int32) -> String { + public func Conversation_StatusOnline(_ value: Int32) -> String { let form = presentationStringsPluralizationForm(self.lc, value) return String(format: self._ps[85 * 6 + Int(form.rawValue)]!, "\(value)") } diff --git a/TelegramUI/PresentationTheme.swift b/TelegramUI/PresentationTheme.swift index cd69d07289..efdb3e0735 100644 --- a/TelegramUI/PresentationTheme.swift +++ b/TelegramUI/PresentationTheme.swift @@ -1,6 +1,7 @@ import Foundation import UIKit import Display +import TelegramCore public enum PresentationThemeParsingError: Error { case generic @@ -561,28 +562,59 @@ public final class PresentationThemeChatBubble { } } -public final class PresentationThemeServiceMessage { - public let serviceMessageFillColor: UIColor - public let serviceMessagePrimaryTextColor: UIColor - public let serviceMessageLinkHighlightColor: UIColor +public final class PresentationThemeServiceMessageColorComponents { + public let fill: UIColor + public let primaryText: UIColor + public let linkHighlight: UIColor + public let dateFillStatic: UIColor + public let dateFillFloating: UIColor + + public init(fill: UIColor, primaryText: UIColor, linkHighlight: UIColor, dateFillStatic: UIColor, dateFillFloating: UIColor) { + self.fill = fill + self.primaryText = primaryText + self.linkHighlight = linkHighlight + self.dateFillStatic = dateFillStatic + self.dateFillFloating = dateFillFloating + } +} + +public final class PresentationThemeServiceMessageColor { + public let withDefaultWallpaper: PresentationThemeServiceMessageColorComponents + public let withCustomWallpaper: PresentationThemeServiceMessageColorComponents + + public init(withDefaultWallpaper: PresentationThemeServiceMessageColorComponents, withCustomWallpaper: PresentationThemeServiceMessageColorComponents) { + self.withDefaultWallpaper = withDefaultWallpaper + self.withCustomWallpaper = withCustomWallpaper + } +} + +public func serviceMessageColorComponents(theme: PresentationTheme, wallpaper: TelegramWallpaper) -> PresentationThemeServiceMessageColorComponents { + return serviceMessageColorComponents(chatTheme: theme.chat, wallpaper: wallpaper) +} + +public func serviceMessageColorComponents(chatTheme: PresentationThemeChat, wallpaper: TelegramWallpaper) -> PresentationThemeServiceMessageColorComponents { + if wallpaper != .builtin { + return chatTheme.serviceMessage.components.withCustomWallpaper + } else { + return chatTheme.serviceMessage.components.withDefaultWallpaper + } +} + +public final class PresentationThemeServiceMessage { + public let components: PresentationThemeServiceMessageColor + public let unreadBarFillColor: UIColor public let unreadBarStrokeColor: UIColor public let unreadBarTextColor: UIColor - public let dateFillStaticColor: UIColor - public let dateFillFloatingColor: UIColor public let dateTextColor: UIColor - public init(serviceMessageFillColor: UIColor, serviceMessagePrimaryTextColor: UIColor, serviceMessageLinkHighlightColor: UIColor, unreadBarFillColor: UIColor, unreadBarStrokeColor: UIColor, unreadBarTextColor: UIColor, dateFillStaticColor: UIColor, dateFillFloatingColor: UIColor, dateTextColor: UIColor) { - self.serviceMessageFillColor = serviceMessageFillColor - self.serviceMessagePrimaryTextColor = serviceMessagePrimaryTextColor - self.serviceMessageLinkHighlightColor = serviceMessageLinkHighlightColor + public init(components: PresentationThemeServiceMessageColor, unreadBarFillColor: UIColor, unreadBarStrokeColor: UIColor, unreadBarTextColor: UIColor, dateTextColor: UIColor) { + self.components = components self.unreadBarFillColor = unreadBarFillColor self.unreadBarStrokeColor = unreadBarStrokeColor self.unreadBarTextColor = unreadBarTextColor - self.dateFillStaticColor = dateFillStaticColor - self.dateFillFloatingColor = dateFillFloatingColor self.dateTextColor = dateTextColor } } diff --git a/TelegramUI/PresentationThemeEssentialGraphics.swift b/TelegramUI/PresentationThemeEssentialGraphics.swift index 69547bd8b6..549c9e7d5e 100644 --- a/TelegramUI/PresentationThemeEssentialGraphics.swift +++ b/TelegramUI/PresentationThemeEssentialGraphics.swift @@ -76,6 +76,11 @@ public final class PrincipalThemeEssentialGraphics { public let checkFreeFullImage: UIImage public let checkFreePartialImage: UIImage + public let chatServiceBubbleFillImage: UIImage + public let chatFreeformContentAdditionalInfoBackgroundImage: UIImage + public let chatEmptyItemBackgroundImage: UIImage + public let chatLoadingIndicatorBackgroundImage: UIImage + public let clockBubbleIncomingFrameImage: UIImage public let clockBubbleIncomingMinImage: UIImage public let clockBubbleOutgoingFrameImage: UIImage @@ -98,9 +103,9 @@ public final class PrincipalThemeEssentialGraphics { public let radialIndicatorFileIconIncoming: UIImage public let radialIndicatorFileIconOutgoing: UIImage - init(_ theme: PresentationThemeChat, wallpaper: Bool) { - let incoming: PresentationThemeBubbleColorComponents = !wallpaper ? theme.bubble.incoming.withoutWallpaper : theme.bubble.incoming.withWallpaper - let outgoing: PresentationThemeBubbleColorComponents = !wallpaper ? theme.bubble.outgoing.withoutWallpaper : theme.bubble.outgoing.withWallpaper + init(_ theme: PresentationThemeChat, wallpaper: TelegramWallpaper) { + let incoming: PresentationThemeBubbleColorComponents = wallpaper.isEmpty ? theme.bubble.incoming.withoutWallpaper : theme.bubble.incoming.withWallpaper + let outgoing: PresentationThemeBubbleColorComponents = wallpaper.isEmpty ? theme.bubble.outgoing.withoutWallpaper : theme.bubble.outgoing.withWallpaper self.chatMessageBackgroundIncomingImage = messageBubbleImage(incoming: true, fillColor: incoming.fill, strokeColor: incoming.stroke, neighbors: .none) self.chatMessageBackgroundIncomingHighlightedImage = messageBubbleImage(incoming: true, fillColor: incoming.highlightedFill, strokeColor: incoming.stroke, neighbors: .none) @@ -135,8 +140,18 @@ public final class PrincipalThemeEssentialGraphics { self.checkMediaFullImage = generateCheckImage(partial: false, color: .white)! self.checkMediaPartialImage = generateCheckImage(partial: true, color: .white)! - self.checkFreeFullImage = generateCheckImage(partial: false, color: theme.serviceMessage.serviceMessagePrimaryTextColor)! - self.checkFreePartialImage = generateCheckImage(partial: true, color: theme.serviceMessage.serviceMessagePrimaryTextColor)! + let serviceColor = serviceMessageColorComponents(chatTheme: theme, wallpaper: wallpaper) + self.checkFreeFullImage = generateCheckImage(partial: false, color: serviceColor.primaryText)! + self.checkFreePartialImage = generateCheckImage(partial: true, color: serviceColor.primaryText)! + + self.chatServiceBubbleFillImage = generateImage(CGSize(width: 20.0, height: 20.0), contextGenerator: { size, context -> Void in + context.clear(CGRect(origin: CGPoint(), size: size)) + context.setFillColor(serviceColor.fill.cgColor) + context.fillEllipse(in: CGRect(origin: CGPoint(), size: size)) + })!.stretchableImage(withLeftCapWidth: 8, topCapHeight: 8) + self.chatFreeformContentAdditionalInfoBackgroundImage = generateStretchableFilledCircleImage(radius: 4.0, color: serviceColor.fill)! + self.chatEmptyItemBackgroundImage = generateStretchableFilledCircleImage(radius: 14.0, color: serviceColor.fill)! + self.chatLoadingIndicatorBackgroundImage = generateStretchableFilledCircleImage(diameter: 30.0, color: serviceColor.fill)! self.clockBubbleIncomingFrameImage = generateClockFrameImage(color: theme.bubble.incomingPendingActivityColor)! self.clockBubbleIncomingMinImage = generateClockMinImage(color: theme.bubble.incomingPendingActivityColor)! @@ -146,28 +161,28 @@ public final class PrincipalThemeEssentialGraphics { self.clockMediaFrameImage = generateClockFrameImage(color: .white)! self.clockMediaMinImage = generateClockMinImage(color: .white)! - self.clockFreeFrameImage = generateClockFrameImage(color: theme.serviceMessage.serviceMessagePrimaryTextColor)! - self.clockFreeMinImage = generateClockMinImage(color: theme.serviceMessage.serviceMessagePrimaryTextColor)! + self.clockFreeFrameImage = generateClockFrameImage(color: serviceColor.primaryText)! + self.clockFreeMinImage = generateClockMinImage(color: serviceColor.primaryText)! self.dateAndStatusMediaBackground = generateStretchableFilledCircleImage(diameter: 18.0, color: theme.bubble.mediaDateAndStatusFillColor)! - self.dateAndStatusFreeBackground = generateStretchableFilledCircleImage(diameter: 18.0, color: theme.serviceMessage.serviceMessageFillColor)! + self.dateAndStatusFreeBackground = generateStretchableFilledCircleImage(diameter: 18.0, color: serviceColor.primaryText)! let impressionCountImage = UIImage(bundleImageName: "Chat/Message/ImpressionCount")! self.incomingDateAndStatusImpressionIcon = generateTintedImage(image: impressionCountImage, color: theme.bubble.incomingSecondaryTextColor)! self.outgoingDateAndStatusImpressionIcon = generateTintedImage(image: impressionCountImage, color: theme.bubble.outgoingSecondaryTextColor)! self.mediaImpressionIcon = generateTintedImage(image: impressionCountImage, color: .white)! - self.freeImpressionIcon = generateTintedImage(image: impressionCountImage, color: theme.serviceMessage.serviceMessagePrimaryTextColor)! + self.freeImpressionIcon = generateTintedImage(image: impressionCountImage, color: serviceColor.primaryText)! let chatDateSize: CGFloat = 20.0 self.dateStaticBackground = generateImage(CGSize(width: chatDateSize, height: chatDateSize), contextGenerator: { size, context -> Void in context.clear(CGRect(origin: CGPoint(), size: size)) - context.setFillColor(theme.serviceMessage.dateFillStaticColor.cgColor) + context.setFillColor(serviceColor.dateFillStatic.cgColor) context.fillEllipse(in: CGRect(origin: CGPoint(), size: size)) })!.stretchableImage(withLeftCapWidth: Int(chatDateSize) / 2, topCapHeight: Int(chatDateSize) / 2) self.dateFloatingBackground = generateImage(CGSize(width: chatDateSize, height: chatDateSize), contextGenerator: { size, context -> Void in context.clear(CGRect(origin: CGPoint(), size: size)) - context.setFillColor(theme.serviceMessage.dateFillFloatingColor.cgColor) + context.setFillColor(serviceColor.dateFillFloating.cgColor) context.fillEllipse(in: CGRect(origin: CGPoint(), size: size)) })!.stretchableImage(withLeftCapWidth: Int(chatDateSize) / 2, topCapHeight: Int(chatDateSize) / 2) diff --git a/TelegramUI/Resources/PresentationStrings.mapping b/TelegramUI/Resources/PresentationStrings.mapping index a004905a1d4cf4e30e19d8e1ff9397a1a6779ce4..e733f51b6020ec4f466a6e98fe4455334639d626 100644 GIT binary patch delta 26850 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 map { presentationData, status in - return ItemListControllerTabBarItem(title: presentationData.strings.Settings_Title, image: icon, selectedImage: icon, badgeValue: status != .allowed ? "!" : nil) + return ItemListControllerTabBarItem(title: presentationData.strings.Settings_Title, image: icon, selectedImage: icon, badgeValue: nil) + //return ItemListControllerTabBarItem(title: presentationData.strings.Settings_Title, image: icon, selectedImage: icon, badgeValue: status != .allowed ? "!" : nil) }) pushControllerImpl = { [weak controller] value in (controller?.navigationController as? NavigationController)?.replaceAllButRootController(value, animated: true) diff --git a/TelegramUI/SetupTwoStepVerificationContentNode.swift b/TelegramUI/SetupTwoStepVerificationContentNode.swift index 3a051d124b..ba0d8eb224 100644 --- a/TelegramUI/SetupTwoStepVerificationContentNode.swift +++ b/TelegramUI/SetupTwoStepVerificationContentNode.swift @@ -71,7 +71,6 @@ final class SetupTwoStepVerificationContentNode: ASDisplayNode, UITextFieldDeleg self.inputNode.textField.textContentType = .oneTimeCode } case .email: - self.inputNode.textField.autocapitalizationType = .none self.inputNode.textField.autocorrectionType = .no self.inputNode.textField.keyboardType = .emailAddress diff --git a/TelegramUI/SetupTwoStepVerificationControllerNode.swift b/TelegramUI/SetupTwoStepVerificationControllerNode.swift index 00e160d01c..4d12babf43 100644 --- a/TelegramUI/SetupTwoStepVerificationControllerNode.swift +++ b/TelegramUI/SetupTwoStepVerificationControllerNode.swift @@ -268,7 +268,7 @@ final class SetupTwoStepVerificationControllerNode: ViewControllerTracingNode { insets.bottom += inputHeight } } - let contentFrame = CGRect(origin: CGPoint(x: 0.0, y: 0), size: CGSize(width: state.layout.layout.size.width, height: state.layout.layout.size.height)) + let contentFrame = CGRect(origin: CGPoint(x: 0.0, y: 0.0), size: CGSize(width: state.layout.layout.size.width, height: state.layout.layout.size.height)) if state.data.state?.kind != self.contentNode?.kind { if let dataState = state.data.state { let title: String diff --git a/TelegramUI/SolidRoundedButtonNode.swift b/TelegramUI/SolidRoundedButtonNode.swift index 184f6cfae7..1f45992815 100644 --- a/TelegramUI/SolidRoundedButtonNode.swift +++ b/TelegramUI/SolidRoundedButtonNode.swift @@ -5,7 +5,7 @@ import Display private let textFont: UIFont = Font.regular(16.0) final class SolidRoundedButtonNode: ASDisplayNode { - private var theme: AuthorizationTheme + private var theme: PresentationTheme private let buttonBackgroundNode: ASImageNode private let buttonNode: HighlightTrackingButtonNode @@ -25,7 +25,7 @@ final class SolidRoundedButtonNode: ASDisplayNode { } } - init(title: String? = nil, theme: AuthorizationTheme, height: CGFloat = 48.0, cornerRadius: CGFloat = 24.0) { + init(title: String? = nil, theme: PresentationTheme, height: CGFloat = 48.0, cornerRadius: CGFloat = 24.0) { self.theme = theme self.buttonHeight = height self.buttonCornerRadius = cornerRadius @@ -35,7 +35,7 @@ final class SolidRoundedButtonNode: ASDisplayNode { self.buttonBackgroundNode.isLayerBacked = true self.buttonBackgroundNode.displayWithoutProcessing = true self.buttonBackgroundNode.displaysAsynchronously = false - self.buttonBackgroundNode.image = generateStretchableFilledCircleImage(radius: cornerRadius, color: theme.accentColor) + self.buttonBackgroundNode.image = generateStretchableFilledCircleImage(radius: cornerRadius, color: theme.list.itemCheckColors.fillColor) self.buttonNode = HighlightTrackingButtonNode() @@ -72,7 +72,7 @@ final class SolidRoundedButtonNode: ASDisplayNode { transition.updateFrame(node: self.buttonNode, frame: buttonFrame) if self.title != self.labelNode.attributedText?.string { - self.labelNode.attributedText = NSAttributedString(string: self.title ?? "", font: Font.medium(17.0), textColor: self.theme.backgroundColor) + self.labelNode.attributedText = NSAttributedString(string: self.title ?? "", font: Font.medium(17.0), textColor: self.theme.list.itemCheckColors.foregroundColor) } let labelSize = self.labelNode.updateLayout(buttonSize) diff --git a/TelegramUI/TelegramRootController.swift b/TelegramUI/TelegramRootController.swift index 01fca1a068..7997c16ee3 100644 --- a/TelegramUI/TelegramRootController.swift +++ b/TelegramUI/TelegramRootController.swift @@ -116,30 +116,4 @@ public final class TelegramRootController: NavigationController { } presentedLegacyShortcutCamera(account: self.account, saveCapturedMedia: false, saveEditedPhotos: false, mediaGrouping: true, parentController: controller) } - - public func requestPermissions() { - guard let parentController = self.viewControllers.last as? ViewController else { - return - } - - let account = self.account - let _ = (DeviceAccess.authorizationStatus(account: account, subject: .notifications) - |> take(1) - |> deliverOnMainQueue).start(next: { status in - if status != .allowed { - let controller = PermissionController(account: self.account) - controller.updateData(subject: .notifications, currentStatus: status, allow: { - switch status { - case .notDetermined: - account.telegramApplicationContext.applicationBindings.registerForNotifications() - case .denied: - account.telegramApplicationContext.applicationBindings.openSettings() - default: - break - } - }) - parentController.present(controller, in: .window(.root)) - } - }) - } }