tweb/public/5.4c631eb421e5df7ab421.chunk.js.map
Eduard Kuzmenko 10b7307141 Build
2022-01-25 10:36:42 +04:00

1 line
1.8 MiB
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{"version":3,"sources":["webpack:///./src/helpers/cleanUsername.ts","webpack:///./src/lib/appManagers/appUsersManager.ts","webpack:///./src/lib/storages/dialogs.ts","webpack:///./src/lib/storages/filters.ts","webpack:///./src/lib/appManagers/appMessagesManager.ts","webpack:///./src/lib/appManagers/appPeersManager.ts","webpack:///./src/lib/appManagers/appChatsManager.ts","webpack:///./src/components/peerTitle.ts","webpack:///./src/lib/appManagers/appPhotosManager.ts","webpack:///./src/helpers/bytes.ts","webpack:///./src/lib/appManagers/appStickersManager.ts","webpack:///./src/lib/appManagers/appProfileManager.ts","webpack:///./src/lib/appManagers/apiUpdatesManager.ts","webpack:///./src/lib/appManagers/appDocsManager.ts","webpack:///./src/lib/mtproto/serverTimeManager.ts","webpack:///./src/components/visibilityIntersector.ts","webpack:///./src/components/lazyLoadQueue.ts","webpack:///./src/helpers/formatPhoneNumber.ts","webpack:///./src/helpers/assumeType.ts","webpack:///./src/helpers/dom/htmlToSpan.ts","webpack:///./src/lib/mtproto/bin_utils.ts","webpack:///./src/helpers/windowSize.ts","webpack:///./src/lib/appManagers/appMessagesIdsManager.ts","webpack:///./src/lib/appManagers/appNotificationsManager.ts","webpack:///./src/helpers/dom/renderImageFromUrl.ts","webpack:///./src/helpers/fixBase64String.ts","webpack:///./src/components/preloader.ts","webpack:///./src/helpers/files.ts","webpack:///./src/vendor/leemon.ts","webpack:///./src/lib/appManagers/appAvatarsManager.ts","webpack:///./src/helpers/middleware.ts","webpack:///./src/lib/calls/groupCallState.ts","webpack:///./src/lib/searchIndex.ts","webpack:///./src/components/middleEllipsis.ts","webpack:///./src/lib/appManagers/appDraftsManager.ts","webpack:///./src/helpers/audioAssetPlayer.ts","webpack:///./src/lib/appManagers/appGroupCallsManager.ts","webpack:///./src/lib/calls/helpers/createMainStreamManager.ts","webpack:///./src/helpers/cleanSearchText.ts","webpack:///./src/helpers/slicedArray.ts","webpack:///./src/lib/appManagers/appPollsManager.ts","webpack:///./src/lib/calls/utils.ts","webpack:///./src/lib/calls/localConferenceDescription.ts","webpack:///./src/helpers/heavyQueue.ts","webpack:///./src/helpers/blur.ts","webpack:///./src/lib/mtproto/referenceDatabase.ts","webpack:///./src/helpers/dom/htmlToDocumentFragment.ts","webpack:///./src/lib/mtproto/connectionStatus.ts","webpack:///./src/lib/calls/helpers/getStream.ts","webpack:///./src/lib/calls/helpers/getVideoConstraints.ts","webpack:///./src/lib/calls/streamManager.ts","webpack:///./src/environment/vibrateSupport.ts","webpack:///./src/lib/opusDecodeController.ts","webpack:///./src/lib/appManagers/appWebPagesManager.ts","webpack:///./src/environment/imageMimeTypesSupport.ts","webpack:///./src/lib/calls/constants.ts","webpack:///./src/lib/calls/helpers/stopTrack.ts","webpack:///./src/lib/mtproto/schema.ts","webpack:///./src/lib/crypto/crypto_utils.ts","webpack:///./src/lib/mtproto/tl_utils.ts","webpack:///./src/lib/crypto/srp.ts","webpack:///./src/lib/crypto/cryptoworker.ts","webpack:///./src/lib/mtproto/timeManager.ts","webpack:///./src/lib/mtproto/transports/obfuscation.ts","webpack:///./src/lib/mtproto/transports/intermediate.ts","webpack:///./src/lib/mtproto/transports/tcpObfuscated.ts","webpack:///./src/lib/mtproto/transports/socketProxied.ts","webpack:///./src/lib/mtproto/dcConfigurator.ts","webpack:///./src/lib/mtproto/transports/controller.ts","webpack:///./src/lib/mtproto/transports/http.ts","webpack:///./src/lib/mtproto/networker.ts","webpack:///./src/lib/mtproto/networkerFactory.ts","webpack:///./src/lib/mtproto/rsaKeysManager.ts","webpack:///./src/lib/mtproto/authorizer.ts","webpack:///./src/lib/mtproto/apiManager.ts","webpack:///./src/lib/calls/helpers/getScreenStream.ts","webpack:///./src/lib/calls/helpers/getStreamCached.ts","webpack:///./src/lib/calls/callInstanceBase.ts","webpack:///./src/lib/calls/sdp/index.ts","webpack:///./src/helpers/string/splitStringByLimitWithRest.ts","webpack:///./src/helpers/uniqueNumberGenerator.ts","webpack:///./src/lib/calls/sdp/attributeSplitted.ts","webpack:///./src/lib/calls/sdp/mediaLineParts.ts","webpack:///./src/lib/calls/sdp/line.ts","webpack:///./src/lib/calls/sdp/attributeInner.ts","webpack:///./src/lib/calls/sdp/attributes.ts","webpack:///./src/lib/calls/sdp/mediaSection.ts","webpack:///./src/lib/calls/sdp/sessionSection.ts","webpack:///./src/lib/calls/sdp/utils.ts","webpack:///./src/lib/calls/helpers/parseMediaSectionInfo.ts","webpack:///./src/lib/calls/helpers/parseSourceGroups.ts","webpack:///./src/lib/calls/helpers/fixLocalOffer.ts","webpack:///./src/lib/calls/groupCallConnectionInstance.ts","webpack:///./src/lib/calls/callConnectionInstanceBase.ts","webpack:///./src/lib/calls/helpers/createPeerConnection.ts","webpack:///./src/lib/calls/helpers/createDataChannel.ts","webpack:///./src/lib/calls/helpers/processMediaSection.ts","webpack:///./src/lib/calls/helpers/filterServerCodecs.ts","webpack:///./src/lib/calls/groupCallInstance.ts","webpack:///./src/lib/calls/helpers/getScreenConstraints.ts","webpack:///./src/helpers/formatCallDuration.ts","webpack:///./src/helpers/formatDuration.ts","webpack:///./src/environment/movSupport.ts","webpack:///./src/environment/videoMimeTypesSupport.ts","webpack:///./src/lib/calls/helpers/getAudioConstraints.ts","webpack:///./src/environment/constraintSupport.ts","webpack:///./src/lib/calls/sdpBuilder.ts","webpack:///./src/lib/calls/stringFromLineBuilder.ts"],"names":["cleanUsername","username","toLowerCase","appUsersManager","storage","appStateManager","storages","users","updateUsersStatuses","timestampNow","i","this","user","updateUserStatus","clear","setInterval","rootScope","addEventListener","addMultipleEventsListeners","update","userId","user_id","status","expires","serverTimeManager","serverTimeOffset","was_online","dispatchEvent","setUserToStateIfNeeded","updateUserPhoto","photo","photo_id","forceUserOnline","date","_","toPeerId","console","warn","updateUserName","saveApiUser","Object","assign","first_name","last_name","e","getSelf","id","contactsIndex","indexObject","getUserSearchText","getState","then","state","storagesResults","length","setUserNameToCache","contactsList","Array","isArray","forEach","pushContact","contactsFillPromise","resolve","peerId","appPeersManager","isUser","toUserId","getFromCache","set","getUser","delete","init","usernames","isPeerNeeded","findAndSplice","getTopPeersPromises","createSearchIndex","undefined","Set","updatedContactsList","pushToState","cached","isFulfilled","promise","invokeApi","result","saveApiUsers","contacts","contact","onContactsModified","slice","Promise","resolvedPeer","appChatsManager","saveApiChats","chats","getPeer","getPeerId","peer","add","requestPeerSingle","releaseSinglePeer","phone","pFlags","self","format","filter","Boolean","join","query","includeSaved","sortBy","fillContacts","_contactsList","results","search","has","sort","userId1","userId2","sortName1","sortName","sortName2","localeCompare","status1","getUserStatusForSort","myUserId","myId","testSelfSearch","unshift","getContacts","userIds","map","block","invokeApiSingle","getInputPeerById","value","apiUpdatesManager","processLocalUpdate","peer_id","getOutputPeer","blocked","index","clearBadChars","ignoreCase","latinize","includeTag","apiUsers","override","saved","oldUser","oldSearchUsername","searchUsername","min","initials","fullName","deleted","cleanSearchText","getAbbreviation","changedPhoto","changedTitle","wasContact","newContact","onContactUpdated","formatPhoneNumber","formatted","access_hash","key","args","isBot","support","today","Date","diff","getTime","getDate","dateEl","timeEl","bot","isRegularUser","isContact","allowMin","phone_number","vcard","eventTimestamp","timestamp","updatesState","syncLoading","importContacts","phones","error","Error","type","inputContacts","j","push","client_id","toString","importedContactsResult","imported","importedContact","topPeersCache","cachedTime","now","peers","offset","limit","hash","topPeers","categories","topPeer","requestPeer","rating","contactsBlocked","count","peerIds","u","concat","c","lat","long","accuracy_radius","background","self_expires","geo_point","updates","processUpdateMessage","invokeApiCacheable","q","cacheSeconds","my_results","p","curIsContact","popContact","offline","showPhone","getUserInput","add_phone_privacy_exception","appMessagesManager","appDraftsManager","appNotificationsManager","appMessagesIdsManager","folders","onUpdateFolderPeers","folder_peers","folderPeer","folder_id","dialog","dropDialog","pinned","handleDialogUnpinning","generateIndexForDialog","pushDialog","scheduleHandleNewDialogs","onUpdateDialogPinned","folderId","getDialogOnly","onUpdatePinnedDialogs","handleOrder","order","pinnedOrders","reverse","newPinned","dialogs","getFolderDialogs","dialogsResult","applyDialogs","d","getCache","peerText","getPeerSearchText","dialogsIndex","onFilterUpdate","getCachedDialogs","processDialogForFilter","filterId","processDialogForFilters","indexKey","orderIndex","chatId","chat","getChat","left","dropDialogOnDeletion","updateFolderPeers","updateDialogPinned","updatePinnedDialogs","freezeSaving","setDialogsFromState","bind","allDialogsLoaded","top_message","getServerMessageId","topMessage","saveMessages","saveDialog","getMessageByPeer","reloadConversation","loaded","0","1","setDialogsLoaded","savePinnedOrders","dialogsOffsetDate","dialogsNum","cachedResults","offsetDate","Math","getOffsetDate","unreadMessagesCount","unreadDialogsCount","skipMigrated","folder","getFolder","migratedTo","filtersStorage","testDialogForFilter","pinnedIndex","pinnedPeerIds","indexOf","generateDialogIndex","generateDialogPinnedDateByIndex","pinned_peers","skipped","isPinned","filters","getDialogIndexKey","wasIndex","findIndex","wasDialog","wasDialogIndex","newDialogIndex","setDialogIndexInFilter","prepareFolderUnreadCountModifyingByDialog","splice","callbacks","callback","toggle","wasUnreadCount","getDialogUnreadCount","newUnreadCount","addMessagesCount","addDialogsCount","modifyFolderUnreadCount","max","dispatchUnreadTimeout","ctx","setTimeout","justReturn","message","topDate","generateDialogPinnedDate","channelId","isChannel","toChatId","channel","draft","foundIndex","pts","historyStorage","getHistoryStorage","messagesStorage","getMessagesStorage","history","incomingMessage","mid","getMessageFromStorage","is_outgoing","fromId","viaBotId","isAnyChat","newPts","getChannelState","ignoreOffsetDate","saveGlobalOffset","pos","setDialogToState","getDialogOffsetDate","savedGlobalOffsetDate","savedOffsetDate","isDialogsLoaded","clearDialogFromState","foundDialog","getDialog","wasPinned","keepLocal","dropped","dropDialogWithEvent","idx","messages","updatedDialogs","topPendingMessage","pendingTopMsgs","maxId","newUpdatesAfterReloadToHandle","saveUpdate","size","keys","kicked","wasDialogBefore","generateMessageId","wasTopMessage","generateTempMessageId","from_id","out","isOutgoing","log","migrated_to","deactivated","migratedToPeer","migratedFromTo","migratedToFrom","read_inbox_max_id","read_outbox_max_id","saveDraft","isOut","unread","unread_count","isEnd","Bottom","insertSlice","setEnd","mergeReplyKeyboard","readMaxId","readOutboxMaxId","savePeerSettings","settings","notify_settings","addChannelState","getFilter","offsetIndex","ret","promises","fillContactsResult","reloadMissingDialogsPromise","reloadMissingPeerIds","all","getDialogs","realFolderId","curDialogStorage","indexStr","d1","d2","loadedAll","isEnoughDialogs","isTopEnd","getTopMessages","convertment","onUpdateDialogFilter","saveDialogFilter","onUpdateDialogFilterOrder","setOrderIndex","hasOwnProperty","updateDialogFilter","updateDialogFilters","oldFilters","getDialogFilters","_filterId","find","updateDialogFilterOrder","reloadedPeerIds","excludePeerIds","includes","includePeerIds","exclude_archived","exclude_read","isDialogUnread","exclude_muted","isPeerLocalMuted","unread_mentions_count","broadcasts","isBroadcast","groups","isAnyGroup","bots","non_contacts","config","pinned_infolder_count_max","reject","prepend","remove","flags","getOutputDialogFilter","bool","f","a","b","filterIncludedPinnedPeers","include_peers","reloadDialogs","inputPeer","reloadPromises","reloadPromise","overwrite","from","to","oldFilter","pendingByRandomId","pendingByMessageId","pendingAfterMsgs","tempFinalizeCallbacks","sendSmthLazyLoadQueue","needSingleMessages","Map","fetchSingleMessagesPromise","maxSeenId","newMessagesHandleTimeout","newMessagesToHandle","newDialogsToHandle","notificationsHandlePromise","notificationsToHandle","reloadConversationsPeers","logger","Debug","Log","Warn","groupedTempId","typings","unreadMentions","goToNextMentionPromises","handleNewMessages","clearTimeout","handleNewDialogs","newMaxSeenId","obj","dialogsStorage","incrementMaxSeenId","handleNotifications","window","_peerId","idle","isIDLE","notifyPeerToHandle","getNotifyPeerTypeSettings","getNotifySettings","getInputNotifyPeerById","peerTypeNotifySettings","notifyAboutMessage","fwdCount","onUpdateMessageId","randomId","random_id","pendingData","tempId","threadId","finalizePendingMessageCallbacks","onUpdateNewMessage","getMessagePeer","isLocalThreadUpdate","threadKey","getThreadKey","split","threadsStorage","good","isInChat","ignoreExisting","pendingMessage","checkPendingMessage","updateMessageRepliesIfNeeded","findSlice","firstSlice","first","action","channel_id","top_msg_id","chat_id","handleNewMessage","inboxUnread","releaseUnreadCount","prepareDialogUnreadCountModifying","mentioned","modifyCachedMentions","setDialogTopMessage","notifyPeer","fwd_from","onUpdateDialogUnreadMark","unread_mark","onUpdateEditMessage","oldMessage","newMessage","handleEditedMessage","isTopMessage","clear_history","grouped_id","onUpdateReadHistory","max_id","read_max_id","stillUnreadCount","still_unread_count","newUnreadMentionsCount","foundAffected","repliesKey","threadsToReplies","updateMessage","get","replyTo","reply_to","reply_to_top_id","reply_to_msg_id","cancel","setCount","getReadMaxIdIfUnread","threadKeyPart","onUpdateReadMessagesContents","mids","getMessageById","fixDialogUnreadMentionsIfNoMessage","media_unread","setDialogToStateIfMessageIsTop","onUpdateChannelAvailableMessages","availableMinId","available_min_id","onUpdateDeleteMessages","clearCache","params","threadKeys","historyUpdated","handleDeletedMessages","threadsStorages","msgs","affected","onUpdateChannel","needDialog","historiesStorage","onUpdateChannelReload","onUpdateChannelMessageViews","views","onUpdateServiceNotification","messageId","inbox_date","media","entities","hasUser","verified","pts_count","onUpdatePinnedMessages","missingMessages","wrapSingleMessage","finally","werePinned","pinnedMessages","hiddenPinnedMessages","onUpdateNotifySettings","onUpdateNewScheduledMessage","scheduledMessagesStorage","isScheduled","onUpdateDeleteScheduledMessages","updateMessageID","updateNewDiscussionMessage","updateNewMessage","updateNewChannelMessage","updateDialogUnreadMark","updateEditMessage","updateEditChannelMessage","updateReadChannelDiscussionInbox","updateReadChannelDiscussionOutbox","updateReadHistoryInbox","updateReadHistoryOutbox","updateReadChannelInbox","updateReadChannelOutbox","updateChannelReadMessagesContents","updateReadMessagesContents","updateChannelAvailableMessages","updateDeleteMessages","updateDeleteChannelMessages","updateChannel","updateChannelReload","updateChannelMessageViews","updateServiceNotification","updatePinnedMessages","updatePinnedChannelMessages","updateNotifySettings","updateNewScheduledMessage","updateDeleteScheduledMessages","filterFunc","getScheduledMessagesStorage","webpage","appWebPagesManager","getWebPage","drop","poll","appPollsManager","pollToMessages","maxSeenMsgId","middleware","clean","messagesStorageByPeerId","groupedMessagesStorage","searchesStorage","threadsServiceMessagesIdsStorage","sendEntites","entity","callbackName","finalize","deferred","text","options","invokeAfterMessageIsSent","editMessage","parseMarkdown","schedule_date","scheduleDate","is_scheduled","newMedia","getInputEntities","no_webpage","noWebPage","handled","trim","replyToMsgId","MAX_LENGTH","message_length_max","splitted","webPage","sendText","getPeerMigratedTo","generateOutgoingMessage","toggleError","on","send","sentRequestOptions","apiPromise","afterMessageId","invokeApiAfter","query_id","queryId","resultId","clear_draft","clearDraft","silent","wrapMessageEntities","seq","local","beforeMessageSending","file","attachType","apiFileName","fileType","mime_type","fileName","File","name","isDocument","Blob","caption","attributes","isPhoto","document","actionName","isVoiceMessage","attribute","voice","waveform","duration","isMedia","photoSize","w","width","h","height","location","sizes","cacheContext","appDownloadManager","getCacheContext","downloaded","url","objectURL","appPhotosManager","savePhoto","videoAttribute","round_message","isRoundMessage","supports_streaming","noSound","file_name","thumbs","thumb","blob","thumbCacheContext","appDocsManager","saveDoc","preloader","attachMethod","tryAgainOnFail","isUpload","sentDeferred","attachPromise","catch","err","uploaded","cancelPendingMessage","setTyping","uploadPromise","file_reference","inputMedia","load","thumbUploadPromise","upload","notifyAll","done","total","inputFile","force_file","addNotifyListener","progress","percents","floor","isGroupedItem","code","files","sendFile","sendFileDetails","groupId","details","o","invoke","multiMedia","multi_media","messageMedia","getMediaInput","doc","inputSingleMedia","inputs","contactPeerId","sendOther","getContactMediaInput","pollId","savePoll","total_voters","recent_voters","getPoll","getPhoto","getDoc","geo","geoPoint","title","address","provider","venue_id","venue_type","postAuthor","signatures","generateFromId","post_author","generateFlags","random","generateReplyHeader","via_bot_id","reply_markup","replyMarkup","replies","generateReplies","pending","replyToTopId","header","channelFull","appProfileManager","chatsFull","linked_chat_id","comments","replies_pts","isAnonymousSending","post","originalMessage","fwdHeader","from_name","channel_post","saved_from_msg_id","saved_from_peer","Number","MAX_SAFE_INTEGER","admin_rights","anonymous","chatHistoryStorage","offset_date","offset_id","offset_peer","offsetPeerId","noErrorBox","resetPinnedOrder","telegramMeWebManager","setAuthorized","maxSeenIdIncremented","hasPrepend","noIdsDialogs","setFolderId","folderDialogs","dialogsLength","slicedDialogs","fromPeerId","dropCaptions","dropAuthor","newMessages","generateForwardHeader","group","from_peer","to_peer","with_my_score","withMyScore","drop_author","drop_media_captions","generateEmptyMessage","createMessageStorage","inputDialogPeer","getInputDialogPeerById","reloadConversationsPromise","inputDialogPeers","fullfillLeft","just_clear","revoke","affectedHistory","doFlushHistory","justClear","getHistory","historyResult","getChannelInput","s","m","ss","getPinnedMessage","getSearch","inputFilter","unpin","pm_oneside","unpinAll","unpinAllMessages","totalEntities","foundMessages","getMidsByAlbum","verify","isMessage","reply_to_mid","overwriting","msgId","savedFromPeerId","savedFromMid","savedFrom","fwdFromId","mediaContext","ttl_seconds","messageKey","getMessageKeyForPendingWebPage","saveWebPage","migrateFrom","migrateTo","suffix","video_sizes","appGroupCallsManager","saveGroupCall","call","video","reason","migrateChecks","saveMessage","apiEntities","fixEmoji","myEntities","parseEntities","mergeEntities","usingMids","plain","highlightWord","withoutMediaType","parts","hasAlbumKey","addPart","langKey","part","el","createElement","innerHTML","append","assumeType","usingFullAlbum","getMidsByMessage","albumText","getAlbumText","emoticon","wrapEmojiText","question","rReply","game","stickerEmojiRaw","stickerEmoji","performer","actionWrapped","wrapMessageActionTextNew","wrapPlainText","match","found","regExp","RegExp","exec","sortEntities","messageWrapped","wrapRichText","noLinebreaks","noLinks","noTextFormat","htmlToDocumentFragment","fragment","createDocumentFragment","senderTitle","classList","fromMe","getMessageSenderPeerIdOrName","element","peerTitle","fromName","onclick","wrapUrl","href","setAttribute","unsafeMessage","langPackKey","getNameDivHTML","getPeerTitle","formatCallDuration","endsWith","wrapJoinVoiceChatAnchor","daysToStart","tomorrowDate","setDate","k","_args","IntlDateElement","day","month","year","t","pinnedMessage","fetchMessageReplyTo","isMessageIsTopMessage","dataset","dir","wrapMessageForReply","htmlToSpan","joined","anchorHTML","domain","langPack","wrapMessageActionTextNewUnsafe","botId","startParam","start_param","inviteToChannel","addChatUser","str","toggleDialogPin","pinned_dialogs_count_max","getPinnedOrders","getDialogPeer","read","hasChat","fromChat","kind","goodMedias","sticker","canMessageBeEdited","edit_time_limit","hasRights","messageReplyMarkup","lastReplyMarkup","selective","maxOutId","single_use","hidden","canCache","func","foundMsgs","filtering","neededContents","neededDocTypes","excludeDocTypes","goodEntities","matchUrl","nextRate","backLimit","minDate","maxDate","filterMessagesByInputFilter","next_rate","offset_id_offset","method","min_date","max_date","add_offset","min_id","offsetId","offsetMessage","offset_rate","searchResult","foundCount","getDiscussionMessage","maxMessageId","serviceStartMessage","is_single","msg_id","filterMessages","generateThreadServiceStartMessage","newDialogsHandlePromise","localMessageIds","creator","delete_messages","affectedMessages","force","triedToReadMaxId","readPromise","soundReset","getPeerString","readHistory","slicedArray","Top","fixUnreadMentionsCountIfNeeded","loadNextPromise","loadNextMentions","last","getUnreadMentions","mergeHistoryResult","minId","messagesMessages","msgIds","threadMessage","broadcastEventName","finalizePendingMessage","mute","mute_until","canSendToUser","finalMessage","tempMessage","newPhoto","newDoc","newPhotoSize","oldCacheContext","downloadOptions","getPhotoDownloadOptions","fakeDownload","getInputFileName","polls","handleReleasingMessage","increment","notification","peerString","notificationMessage","show_previews","tag","peerPhoto","getPeerPhoto","appAvatarsManager","loadAvatar","loadPromise","image","notify","canSendToPeer","isFetchIntervalNeeded","unsetEnd","haveSlice","sliceMe","fulfilled","Both","fillHistoryStorage","constructSlice","offsetIdOffset","topWasMeantToLoad","isBottomEnd","isHistoryResultEnd","requestHistory","oldestMessage","foundSlice","_historyResult","requestPromises","after","getMessagesResult","fetchSingleMessages","replyToPeerId","reply_to_peer_id","typing","timeout","smth","referenceDatabase","deleteContext","deleteWebPageFromPending","updatePollToMessage","groupedId","groupedStorage","albums","peerMessagesToHandle","deletedMids","noforwards","noForwards","DialogColorsFg","DialogColors","DialogColorsMap","newMethod","originMethod","String","prototype","getUserPhoto","getChatPhoto","plainText","onlyFirstName","getUserString","getChatString","isPeerId","charAt","peerParams","substr","isMegagroup","ignorePeerId","getInputPeer","getUserInputPeer","pic","abs","getDialogType","getChatTyped","onChatUpdated","updateChannelParticipant","updateChatDefaultBannedRights","default_banned_rights","apiChats","saveApiChat","oldChat","participants_count","rights","defaultRights","isThread","isCheckingRightsForSelf","megagroup","banned_rights","myFlags","post_messages","broadcast","until_date","getChannelInputPeer","getChatInputPeer","input","usersInputs","fwdLimit","fwd_limit","deleteChatUser","leaveChannel","leaveChat","deleteChannel","deleteChat","inputChatPhoto","about","participant","getParticipantPeerId","actor_id","qts","prev_participant","new_participant","kicked_by","editBanned","view_messages","kickFromChannel","messagesChats","enabled","migrateChat","weakMap","WeakMap","peerTitleWeakMap","querySelectorAll","PeerTitle","AppPhotosManager","photos","context","oldPhoto","saveContext","boxWidth","boxHeight","useBytes","pushDocumentSize","devicePixelRatio","bestPhotoSize","inputUser","photosResult","photoIds","bytes","isSticker","arr","mimeType","Uint8Array","jpegHeader","jpegTail","URL","createObjectURL","path","num","getPreviewURLFromBytes","useBlur","getPreviewURLFromThumb","Image","noZoom","choosePhotoSize","boxSize","aspect","isFit","aspectCovered","style","ignoreCache","getImageFromStrippedThumb","queueId","onlyCache","thumb_size","dcId","dc_id","photoId","fullWidth","fullHeight","download","getDownload","getInput","fullPhotoSize","downloadToDisc","bytesToHex","bytesFromHex","hexString","len","ceil","start","parseInt","bytesToBase64","mod3","nLen","nUint24","nIdx","fromCharCode","uint6ToBase64","replace","nUint6","bytesCmp","bytes1","bytes2","bytesXor","convertToUint8Array","TextEncoder","encode","bufferConcats","reduce","acc","v","byteLength","tmp","lastLength","ArrayBuffer","bytesFromWordss","bytesToWordss","words","Uint32Array","LOCAL_IDS_SET","appStickersManager","getStickerSetPromises","getStickersByEmoticonsPromises","sounds","getAnimatedEmojiStickerSet","updateNewStickerSet","stickerSet","stickerset","saveStickerSet","getGreetingStickersTimeout","getGreetingSticker","justPreload","getGreetingStickersPromise","getStickersByEmoticon","docs","greetingStickers","shift","downloadDoc","cachedSet","documents","refreshTime","useCache","saveStickers","getStickerSetInput","saveById","getStickerSet","getAnimatedEmojiSounds","emoji","animations","getAnimatedEmojiSoundsPromise","getAppConfig","appConfig","emojies_sounds","sound","bytesStr","atob","file_reference_base64","charCodeAt","this_dc","invokeApiHashable","processResult","res","stickers","isAnimation","cleanEmoji","pack","packs","preloadEmojiPromise","getAnimatedEmojiSticker","json","mediaSize","active","emojiSticker","toneIndex","animation","loadAnimationWorker","container","animationData","autoplay","loop","saveLottiePreview","canvas","once","preloadAnimatedEmojiStickerAnimation","soundDoc","getAnimatedEmojiSoundDocument","newSet","setToCache","needSave","installed_date","thumb_dc_id","isAnimated","animated","thumb_version","short_name","sets","covered","archived","excludeFeatured","exclude_featured","foundSaved","cache","cover","getAllStickers","allStickers","includeOurStickers","preloadStickerSets","getRecentStickers","messagesStickers","installedSets","recentStickers","foundStickers","cachedStickersAnimated","cachedStickersStatic","iteratePacks","docId","docEmoticon","_doc","AppProfileManager","usersFull","onUpdateUserTyping","typingsInPeer","cancelAction","getChatFull","onUpdatePeerBlocked","userFull","updateChatParticipants","participants","chatFull","updateChatParticipantAdd","_participants","inviter_id","version","updateChatParticipantDelete","updateUserTyping","updateChatUserTyping","updateChannelUserTyping","updatePeerBlocked","fullChat","updated","call_active","chat_photo","refreshFullPeer","invalidateChannelParticipants","invokeApiSingleProcess","usersUserFull","full_user","profile_photo","rAbout","getProfile","getCachedFullUser","getCachedFullChat","getProfileByPeerId","profile","getChannelFull","full_chat","exported_invite","link","exportedInvite","channelParticipant","fullChannel","processError","getChannelParticipants","cP","getTopPeers","ratingMap","processUserIds","updateResult","previous","deletedList","verifyParticipantForOnlineCount","chatInfo","channelParticipants","reduceParticipantsForOnlineCount","onlines","pendingPtsUpdates","pendingSeqUpdates","syncPending","channelStates","attached","debug","processOpts","seqStart","seq_start","forceGetDifference","processUpdate","toId","Proxy","target","saveUpdatesState","us","nextSeq","pendingUpdatesData","popPendingSeqUpdate","seqAwaiting","ptsAwaiting","curState","curPts","goodPts","goodIndex","getDifference","wasSyncing","pts_total_limit","differenceResult","other_updates","new_messages","apiMessage","nextState","intermediate_state","justAName","channelState","getChannelDifference","lastPtsUpdateTime","popPts","popSeq","popPendingPtsUpdate","newVersion","stateResult","setUpdatesProcessor","setProxy","fetch","ok","EXTENSION_MIME_TYPE_MAP","mov","gif","pdf","savingLottiePreview","downloading","onServiceWorkerFail","supportsStreaming","oldDoc","audioTitle","audioPerformer","alt","stickerSetInput","ext","pop","mappedMimeType","monthAsNumber","leadingZero","isServiceWorkerOnline","getFileURL","thumbSize","inputFileLocation","getFileDownloadOptions","preloadPhoto","tryNotToUseBytes","getThumbURL","originalPromise","isPlaySupported","reader","FileReader","onloadend","uint8","decode","readAsArrayBuffer","stickerCachedThumbs","toBlob","createDownloadAnchor","addTaskListener","task","payload","VisibilityIntersector","onVisibilityChange","items","locked","observer","IntersectionObserver","entries","changed","entry","isIntersecting","visible","getVisible","disconnect","targets","observe","unobserve","unlock","refresh","parallelLimit","queue","inProcess","lockPromise","unlockResolve","processQueue","throttle","_processQueue","item","loadItem","getItem","processItem","addElement","super","lock","intersector","unlockAndRefresh","div","intersectorTimeout","wasSeen","setProcessQueueTimeout","_queue","spliced","prefixes","maxPrefixLength","setPrefix","country","prefix","country_code","originalStr","countriesList","country_codes","prefixCountry","phoneCode","leftPattern","patterns","searchForPattern","pattern","mostMatchedPatternMatches","mostMatchedPattern","_pattern","patternMatches","symbol","x","html","span","isObject","object","intToUint","val","longFromInts","high","low","bigInt","sortLongsArray","addPadding","blockSize","zeroes","blockSizeAsTotalLength","needPadding","padding","randomize","buffer","windowSize","visualViewport","innerWidth","innerHeight","AppMessagesIdsManager","tempNum","temp","MESSAGE_ID_OFFSET","MESSAGE_ID_INCREMENT","clearMessageId","toServer","l","used","notificationsShown","notificationIndex","notificationsCount","soundsPlayed","vibrateSupport","peerSettings","notifyUsers","notifyChats","notifyBroadcasts","faviconEl","head","querySelector","titleBackup","titleChanged","stopped","pushInited","updateLocalSettings","updSettings","nodesktop","volume","novibrate","nopreview","nopush","needPush","isAvailable","registeredDevice","subscribe","unsubscribe","setSettings","nosound","notifications","requestPermission","Notification","removeEventListener","navigator","vibrate","mozVibrate","webkitVibrate","notificationsUiSupport","topMessagesDeferred","notifySoundEl","body","stop","newVal","toggleToggler","tokenData","unregisterDevice","registerDevice","notificationData","period","custom","enable","resetTitle","setFavicon","clearInterval","titleInterval","getContext","beginPath","arc","PI","fillStyle","fill","fontSize","font","textBaseline","textAlign","fillText","toDataURL","getNotifyPeerTypePromise","inputKey","compare_sound","notifyContactsSignUp","prevFavicon","cloneNode","parentNode","replaceChild","peerNotifySettings","isMuted","respectType","n","notifySettings","inputNotify","typeNotifySettings","getPeerLocalSettings","permission","data","testSound","icon","setLocalNotificationsDisabled","close","focus","onclose","show","hide","nextSoundAt","prevSoundVolume","filename","audio","hidePushNotifications","token_type","tokenType","token","tokenValue","other_uids","app_sandbox","secret","loadedURLs","elem","HTMLImageElement","HTMLVideoElement","src","SVGImageElement","setAttributeNS","backgroundImage","renderImageFromUrl","isImage","loader","renderImageFromUrlPromise","fixBase64String","toUrl","ProgressivePreloader","detached","cancelable","streamable","onClick","contains","loadFunc","color","bold","constructContainer","construct","totalLength","downloadSvg","lastElementChild","cancelSvg","previousElementSibling","circle","firstElementChild","setProgress","startTime","onEnd","elapsedTime","delay","TRANSITION_TIME","detach","attach","parentElement","setManual","reset","useRafs","getTotalLength","strokeDasharray","createPosterFromMedia","videoWidth","videoHeight","naturalWidth","naturalHeight","quality","aspectFitted","drawImage","createPosterFromVideo","onseeked","currentTime","onerror","createPosterForVideo","preloadVideo","race","onMediaLoad","readyState","HAVE_METADATA","useCanplayOnIos","getFilesFromEvent","onlyTypes","scanFiles","isDirectory","directoryReader","createReader","readEntries","itemFile","getAsFile","DataTransferItem","DragEvent","dataTransfer","clipboardData","originalEvent","webkitGetAsEntry","requestFile","accept","display","click","radix","bpe","mask","digitsStr","buff","one","int2bigInt","s0","s3","s4","s5","s6","s7","sa","eg_u","eg_A","eg_B","eg_C","eg_D","bitSize","z","expand","ans","copy_","mod","dup","mod_","mult","y","copyInt_","linCombShift_","mult_","powMod","powMod_","pow","sub","sub_","add_","eGCD_","g","halve_","greater","equalsInt","negative","multInt_","leftShift_","greaterShift","kx","ky","divide_","r","y1","y2","subShift_","addShift_","rightShift_","modInt","bits","minSize","str2bigInt","base","kk","substring","addInt_","equals","isZero","bigInt2str","divInt_","bigInt2bytes","littleEndian","cmp","ys","multMod_","squareMod_","k1","k2","kn","np","inverseModInt","mont_","ui","ks","savedAvatarURLs","getAvatarPromise","peerPhotoFileLocation","big","img","onlyThumb","renderThumbPromise","thumbImage","animate","animationsEnabled","putAvatar","stripped_thumb","childElementCount","mutateElement","renderPromise","isDialog","getPeerColorById","avatarAvailable","avatarRendered","abbr","getMiddleware","cleanupObj","cleaned","additionalCallback","_cleanupObj","GROUP_CALL_STATE","SearchIndex","minChars","fullTexts","searchText","newFoundObjs","queryWords","queryWordsLength","fullText","what","foundChars","word","fullTextLength","testQueue","fontFamily","timeoutId","setTestQueue","cancelAnimationFrame","requestAnimationFrame","testQueueElements","testElement","capture","passive","mapped","firstTime","textLength","multiplier","textWidth","elementWidth","textContent","fontWeight","getTextWidth","getBoundingClientRect","newElementWidth","widthChanged","smallerText","smallerWidth","smallerTextLength","half","half1","half2","removeAttribute","measureText","MiddleEllipsisElement","HTMLElement","customElements","define","drafts","getAllDraftPromise","updateDraftMessage","peerID","getKey","getAllDrafts","apiDraft","processApiDraft","draft1","draft2","rMessage","wrapDraftText","localDraft","saveOnServer","serverDraft","getDraft","draftsAreEqual","draftObj","isEmptyDraft","saveLocalDraft","combined","emptyDraft","syncDraft","AudioAssetPlayer","assets","createAudio","play","Audio","pause","playSound","makeSsrcsFromParticipant","makeSsrcFromParticipant","source","audio_source","source_groups","endpoint","presentation","groupCalls","nextOffsets","updateGroupCall","updateGroupCallParticipants","groupCallId","saveApiParticipants","groupCall","currentGroupCall","hangUp","audioAsset","nextOffsetsMap","nextOffset","setNextOffset","newNextOffset","skipCounterUpdating","getCachedParticipants","oldParticipant","hasLeft","muted","can_self_unmute","isCurrentGroupCall","onParticipantUpdate","doNotDispatchParticipantUpdate","getGroupCall","modified","just_joined","apiParticipants","saveApiParticipant","isUpdatingMeInCurrentCall","isSharingAudio","raiseHand","raise_hand_rating","videoStopped","generateSelfVideo","connections","main","sources","setMuted","getGroupCallInput","getInputPeerSelf","raise_hand","video_paused","videoPaused","video_stopped","presentation_paused","presentationPaused","participants_next_offset","oldCall","shouldUpdate","stopConnectingSound","playSoundWithTimeout","stopSound","cancelDelayedPlay","rejoin","joinVideo","streamManager","constraints","getAudioConstraints","getVideoConstraints","stream","getStream","addStream","inputStream","MediaStream","createMainStreamManager","joinGroupCallInternal","bindPrefix","fixSafariAudio","CLOSED","setCurrentGroupCall","getGroupCallFull","connectionInstance","createConnectionInstance","connection","createPeerConnection","negotiate","event","onTrack","iceConnectionState","startConnectingSound","getGroupCallParticipants","values","createDescription","createDataChannel","appendStreamToConference","handleUpdateGroupCallParticipants","updatingSdp","audioSource","sourceGroups","mainSources","presentationSources","tsNow","prepareToSavingNextOffset","ids","groupCallParticipants","next_offset","discard","changeUserMuted","getParticipantByPeerId","editParticipant","badCharsRe","trimRe","clearBadCharsAndTrim","latinizeString","ch","latinizeCh","LatinizeMap","hasTag","processSearchText","SliceEnd","SlicedArray","sliceConstructor","getSliceConstructor","slices","end","None","side","deleteCount","flatten","lowerBound","upperBound","lowerIndex","upperIndex","foundSliceIndex","sliced","insertIndex","prevSlice","nextSlice","sliceOffset","findSliceOffset","sliceStart","sliceEnd","bottomWasMeantToLoad","topFulfilled","bottomFulfilled","updateMessagePoll","poll_id","saveResults","rQuestion","chosenIndexes","answer","chosen","correctAnswers","solution","solutionEntities","correct_answers","solution_entities","optionIds","answers","option","sendVote","votesList","closed","newPoll","getInputMediaPoll","toTelegramSource","fromTelegramSource","getAmplitude","array","scale","rms","sqrt","ConferenceEntry","port","direction","originalDirection","setDirection","transceiver","addTransceiver","isAnswer","generateSsrc","LocalConferenceDescription","sessionId","entriesByMid","entriesBySource","entriesByPeerId","setSource","setPeerId","isSending","sendEntry","recvEntry","createEntry","fromConference","conference","heavyQueue","processingQueue","addHeavyTask","processHeavyQueue","todo","performance","possiblePromise","process","apply","realResult","timedChunk","isFilterAvailable","requireBlurPromise","fastBlurFunc","processBlurNext","radius","iterations","alpha","default","blurPromises","dataUri","onload","contexts","links","originalPayload","refreshReference","postMessage","reference","getContexts","_context","getReferenceByLink","next","refreshEmojiesSoundsPromise","hex","newHex","newContext","template","content","ConnectionStatus","mediaDevices","getUserMedia","getTracks","frameRate","AudioStreamAnalyser","streamSource","createMediaStreamSource","analyser","createAnalyser","gain","createGain","minDecibels","maxDecibels","smoothingTimeConstant","fftSize","connect","StreamManager","interval","streamAnalyser","track","frequencyBinCount","getByteFrequencyData","analyse","counter","amplitudes","AudioContext","webkitAudioContext","outputStream","canCreateConferenceEntry","addTrack","getSource","itemSource","removeTrack","finalizeAddingTrack","changeTimer","oldTrack","timer","lol","transceiverInit","streams","types","tracks","findEntry","createTransceiver","sender","replaceTrack","IS_VIBRATE_SUPPORTED","opusDecodeController","sampleRate","tasks","keepAlive","isPlaySupportedResult","canPlayType","wavWorker","Worker","page","onTaskEnd","worker","command","buffers","typedArray","loadWorker","loadWavWorker","terminateWorkers","executeNewTask","kill","terminate","decoderSampleRate","outputBufferSampleRate","wavBitDepth","wavSampleRate","pages","withWaveform","pushDecodeTask","dataBlob","photoTypeSet","webpages","pendingWebPages","updateWebPage","apiWebPage","oldWebPage","isUpdated","siteName","site_name","shortTitle","author","rTitle","contextHashtag","matches","shortDescriptionText","description","rDescription","contextSite","pendingSet","IMAGE_MIME_TYPES_SUPPORTED","GROUP_CALL_AMPLITUDE_ANALYSE_COUNT_MAX","GROUP_CALL_AMPLITUDE_ANALYSE_INTERVAL_MS","stopTrack","subtle","crypto","sha1HashSync","digest","sha256HashSync","aesEncryptSync","keyBytes","ivBytes","encryptedBytes","encrypt","aesDecryptSync","decryptedBytes","decrypt","rsaEncrypt","publicKey","N","modulus","E","exponent","X","encryptedBigInt","hash_pbkdf2","salt","importKey","deriveBits","pqPrimeFactorization","pqBytes","lim","P","Q","minLen","it","pqPrimeLeemon","bytesModPow","xBigInt","yBigInt","mBigInt","resBigInt","gzipUncompress","inflate","boolFalse","API","constructors","predicate","boolTrue","vector","gzipPacked","MTProto","maxLength","mtproto","startMaxLength","createBuffer","intView","Int32Array","byteView","resultBuffer","resultInt32","subarray","getArray","typed","resultArray","needBytes","previousBuffer","previousArray","field","checkLength","writeInt","iHigh","iLow","sLong","storeLongP","storeIntBytes","storeRawBytes","Float64Array","sUTF8","unescape","encodeURIComponent","methodName","methodData","methods","storeInt","flagsOffsets","param","condType","fieldBit","storeObject","paramName","storeLong","storeString","storeBytes","storeDouble","storeBool","itemType","schema","isBare","constructorData","readInt","doubleView","longDec","isSafeInteger","fetchObject","decodeURIComponent","escape","fetchInt","fetchLong","fetchIntBytes","fetchString","fetchBytes","fetchDouble","fetchBool","fetchVector","fallback","checkType","constructorCmp","uncompressed","constructorsIndex","schemaFallback","int1","int2","overrideKey","isCond","formatJSONValue","jsonValue","objectValues","objectValue","TLDeserialization","TLSerialization","computeSRP","password","isNew","algo","new_algo","current_algo","pw_hash","client_salt","server_salt","invokeCrypto","makePasswordHash","salt1","salt2","padArray","flipper","B","srp_B","pForHash","gForHash","b_for_hash","kHash","k_v","is_good_mod_exp_first","modexp","prime","a_for_hash","secure_random","A","generate_and_check_random","g_b","ux","a_ux","S","K","h1","h2","M1","srp_id","webWorker","taskId","awaiting","utils","timeManager","lastMessageId","timeOffset","sessionStorage","timeTicks","serverTime","localTime","newTimeOffset","server_time_offset","Counter","initialValue","_counter","_remainingCounter","_remainingCounterIndex","_aes","encrypted","Obfuscation","codec","initPayload","val2","reversedPayload","encKey","encIv","decKey","decIv","encNew","decNew","obfuscateTag","Connection","logSuffix","retryTimeout","intermediate","obfuscation","connected","autoReconnect","onOpen","setTransportOpened","networker","setConnectionStatus","Connected","cleanupSent","resend","encoded","encodeBody","releasePending","onMessage","readPacket","parseResponse","response","processMessage","onClose","needTimeout","retryAt","time","lastCloseTime","isNaN","Closed","reconnectTimeout","reconnect","Connecting","bodySent","logTypes","setTransportClosed","setAutoReconnect","toEncode","encodePacket","socketId","socketsProxied","TEST_SUFFIX","test","sslSubdomains","dcOptions","host","chosenServers","transportSocket","connectionType","chosenServer","oooohLetMeLive","transportHTTP","ssl","http","dcOption","transportType","transport","reuse","client","servers","transports","opened","waitForWebSocket","https","dcConfigurator","chooseServer","baseDcId","websocket","httpPromise","_send","websocketPromise","socket","isHttpAvailable","isWebSocketAvailable","destroy","pinging","pingTransports","setTransportValue","mode","arrayBuffer","TextDecoder","setConnected","destroyed","releasing","invokeAfterMsgConstructor","authKey","authKeyId","serverSalt","lastServerMessages","sentMessages","pendingMessages","pendingAcks","pendingResends","nextReq","checkConnectionPeriod","lastResendReq","isOnline","lastResponseTime","activeRequests","checkLongPoll","isClean","longPollPending","isStopped","isFileNetworker","sleepAfter","sendLongPoll","checkConnection","clearCheckConnectionTimeout","serializer","pingId","storeMethod","ping_id","pingMessage","generateId","seq_no","generateSeqNo","getBytes","sendEncryptedRequest","toggleOffline","checkConnectionTimeout","authKeyUint8","isFileUpload","fileUpload","isFileDownload","fileDownload","updateSession","seqNo","prevSessionId","sentMessageId","sentMessage","inner","innerSentMessageId","innerSentMessage","updateSentMessage","notContentRelated","pushMessage","connectionInited","invokeWithLayer","layer","initConnection","userAgent","platform","isMainDomain","language","resultType","isAPI","oldTransport","removeTransport","nextReqTimeout","longPollInterval","changeTransport","forceReconnect","sendingLongPoll","wrapMtpCall","max_delay","wait_after","max_wait","noResponse","longPoll","checkConnectionRetryAt","scheduleRequest","noResponseMsgs","pushResend","shouldResolve","noSchedule","TimedOut","noop","setDrainTimeout","onDrainTimeout","onDrain","willChange","onConnectionStatusChange","innerMsgId","acked","dataWithPadding","msgKeyLargePlain","msgKeyLarge","msgKey","sha2aText","sha2bText","aesKey","aesIv","sha2a","sha2b","akStopped","ackMsgIds","wrapMtpMessage","msg_ids","resendMsgIds","resendOpts","req_msg_id","resend_msg_ids","outMessage","messagesByteLen","hasApiCall","hasHttpWait","lengthOverflow","messageByteLength","generateContainerMessage","messageWithBody","handleSentEncryptedRequestHTTP","innerMessages","getMsgKey","keyIv","getAesKeyIv","encryptedData","dataBuffer","getBuffer","paddingLength","getOffset","getEncryptedMessage","encryptedResult","request","getEncryptedOutput","requestData","baseError","originalError","responseBuffer","deserializer","fetchRawBytes","getDecryptedMessage","calcMsgKey","messageBodyLength","messageBody","mt_message","seqno","stack","setOffset","mt_rpc_result","newServerSalt","bigIntBytes","longToBytes","cb","performScheduledRequest","notEmpty","rawError","error_message","error_code","msg","innerMessage","applyServerSalt","new_server_salt","bad_msg_id","ackMessage","changedOffset","applyServerTime","badMessage","processMessageAck","first_msg_id","updatesProcessor","answer_msg_id","reqResendMessage","badMsgId","networkerFactory","networkers","langPackCode","stoppedNetworkers","langCode","forceReconnectTimeout","testPublicKeysHex","publisKeysHex","publicKeysParsed","prepared","preparePromise","keyParsed","RSAPublicKey","fingerprintBytes","fingerprints","prepare","fingerprintHex","foundKey","fingerprint","requestArray","requestLength","headerArray","errorCode","auth_key_id","msg_len","auth","nonce","sendPlainRequest","rsaKeysManager","serverNonce","server_nonce","pq","server_public_key_fingerprints","select","pAndQ","sendReqDhParams","newNonce","p_q_inner_data_dc","new_nonce","dc","pQInnerDataSerialization","dataPadReversed","keyAesEncrypted","tempKey","dataWithHash","aesEncrypted","keyAesEncryptedBigInt","publicKeyModulusBigInt","getKeyAesEncrypted","req_DH_params","public_key_fingerprint","encrypted_data","requestBytes","newNonceHash","new_nonce_hash","decryptServerDhDataAnswer","encrypted_answer","sendSetClientDhParams","encryptedAnswer","tmpAesKey","tmpAesIv","answerWithHash","answerWithPadding","dhPrime","dh_prime","gA","g_a","server_time","retry","verifyDhParams","dhPrimeHex","_gABigInt","_dhPrimeBigInt","_two","_twoPow","gBytes","gB","retry_id","authKeyHash","authKeyAux","newNonceHash1","new_nonce_hash1","newNonceHash2","new_nonce_hash2","newNonceHash3","new_nonce_hash3","getTransportTypePromise","getTransportType","_try","sendReqPQ","apiManager","cachedNetworkers","cachedExportPromise","gettingNetworkers","afterMessageTempIds","changeTransportType","dcs","oldTransportType","oldObject","newObject","oldGetKey","newGetKey","iterateNetworkers","info","setBaseDcId","userAuth","dcID","getBaseDcId","user_auth","wasDcId","getNetworker","setOnDrainIfNeeded","storageKeys","storageResult","logoutPromises","ignoreErrors","closeDatabases","maxNetworkers","generateNetworkerGetKey","ak","authKeyHex","serverSaltHex","authorizer","_error","newTransportType","canRelease","removeNetworker","prepareTempMessageId","cachedNetworker","rejectPromise","logOut","performRequest","wrapApiCall","exportResolve","exportReject","exportedAuth","newDcId","stopTime","waitTime","floodMaxTimeout","getScreenStream","getDisplayMedia","getStreamCached","_cache","screen","isScreen","player","elements","hasInputTrackKind","requestInputSource","isAudioGood","isVideoGood","isSharingVideo","getVideoTracks","saveInputVideoStream","onInputStream","cleanup","tryAddTrack","isOutput","tagName","isVideo","elementEndpoint","useStream","paused","srcObject","sinkId","outputDeviceId","setSinkId","appendChild","getAudioTracks","isClosing","appendToConference","SDP","session","mediaSections","lines","line","parsed","section","splitStringByLimitWithRest","separator","UniqueNumberGenerator","maxTries","SDPAttributeSplitted","SDPMediaLineParts","protocol","missed","rest","nestedMap","makeAttributes","innerParts","fillAttributes","attributesMap","linesArray","mediaLineParts","exists","resultShouldBeArray","SDPSessionSection","parseSdp","createSection","sessionSection","lineStr","isIncorrectSdpLine","parseSdpLine","parseMediaSectionInfo","sdp","clientInfo","lookupAttributeKeys","setup","ssrc","telegramSourceGroups","sdpLines","semantics","parseSourceGroups","raw","ufrag","pwd","fixLocalOffer","offer","hasMunged","skipAddingMulticast","generator","mediaType","originalSsrcs","ssrcs","generate","ssrcs2","ssrcsStrLines","ssrc2","addSimulcast","mediaLine","localMLine","codecIds","sectionInfo","newData","candidates","setPort","newChannel","addSsrcEntry","mungedSdp","RTCPeerConnection","signalingState","connectionState","dict","dataChannel","stopStream","closeConnection","negotiating","negotiateInternal","JSON","stringify","negotiateThrottled","iceServers","iceTransportPolicy","bundlePolicy","rtcpMuxPolicy","iceCandidatePoolSize","maybeUpdateRemoteVideoConstraints","updateConstraintsInterval","localSdp","mainChannels","processedChannels","processed","processMediaSection","audioChannel","videoChannel","useChannel","channels","setEntrySource","setEntryPeerId","parse","groupCallInput","join_as","setData","extmap","performExtmap","uri","filterServerCodecs","isNewConnection","getEntryByMid","originalOffer","createOffer","iceRestart","setLocalDescription","invokeJoinGroupCall","entriesToDelete","bundle","shouldBeSkipped","answerDescription","generateSdp","deleteEntry","iceGatheringState","setRemoteDescription","updateConstraints","colibriClass","defaultConstraints","maxHeight","onStageEndpoints","minHeight","sendDataChannelData","isSpeakingMap","pinnedSources","participantsSsrcs","hadAutoPinnedSources","dispatchPinnedThrottled","pinnedSource","MUTED","UNMUTED","MUTED_BY_ADMIN","CONNECTING","requestAudioSource","toggleMuted","getElement","clone","raise","stopScreenSharing","addInputVideoStream","startScreenSharingPromise","startScreenSharingInternal","unpinSource","closeConnectionAndStream","isSharingScreen","startScreenSharing","startVideoSharingPromise","startVideoSharingInternal","stopVideoSharing","startVideoSharing","isDiscarded","getEntryBySource","oldSsrcs","pinSource","modifiedTypes","oldSsrc","oldSource","oldEntry","setEndpoint","CALL_DURATION_LANG_KEYS","showLast","formatDuration","strings","VIDEO_MIME_TYPES_SUPPORTED","channelCount","constraint","getSupportedConstraints","constraintSupported","WEBRTC_MEDIA_PORT","getConnectionTypeForMediaType","generateMediaFirstLine","payloadIds","joiner","newLine","strs","foundation","component","toUpperCase","priority","ip","generation","performCandidate","sId","bundleMids","skipCandidates","candidate","addCandidate","streamName","addSource","addMsid","ssrcGroup","isApplication","isInactive","payloadTypes","addTransport","hdrexts","hdrext","clockrate","parameters","fbs","fb","subtype","addSsrc","addHeader","addConference"],"mappings":"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","file":"5.4c631eb421e5df7ab421.chunk.js","sourcesContent":["/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov <igor.beatle@gmail.com>\r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nexport default function cleanUsername(username: string) {\r\n return username && username.toLowerCase() || '';\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov <igor.beatle@gmail.com>\n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\nimport { filterUnique, indexOfAndSplice } from \"../../helpers/array\";\nimport { CancellablePromise, deferredPromise } from \"../../helpers/cancellablePromise\";\nimport cleanSearchText from \"../../helpers/cleanSearchText\";\nimport cleanUsername from \"../../helpers/cleanUsername\";\nimport { formatFullSentTimeRaw, tsNow } from \"../../helpers/date\";\nimport { formatPhoneNumber } from \"../../helpers/formatPhoneNumber\";\nimport { safeReplaceObject, isObject } from \"../../helpers/object\";\nimport { Chat, InputContact, InputMedia, InputPeer, InputUser, User as MTUser, UserProfilePhoto, UserStatus, InputGeoPoint } from \"../../layer\";\nimport I18n, { i18n, LangPackKey } from \"../langPack\";\n//import apiManager from '../mtproto/apiManager';\nimport apiManager from '../mtproto/mtprotoworker';\nimport { REPLIES_PEER_ID, SERVICE_PEER_ID } from \"../mtproto/mtproto_config\";\nimport serverTimeManager from \"../mtproto/serverTimeManager\";\nimport { RichTextProcessor } from \"../richtextprocessor\";\nimport rootScope from \"../rootScope\";\nimport SearchIndex from \"../searchIndex\";\nimport apiUpdatesManager from \"./apiUpdatesManager\";\nimport appChatsManager from \"./appChatsManager\";\nimport appPeersManager from \"./appPeersManager\";\nimport appStateManager from \"./appStateManager\";\n\nexport type User = MTUser.user;\nexport type TopPeerType = 'correspondents' | 'bots_inline';\nexport type MyTopPeer = {id: PeerId, rating: number};\n\nexport class AppUsersManager {\n private storage = appStateManager.storages.users;\n \n private users: {[userId: UserId]: User};\n private usernames: {[username: string]: UserId};\n private contactsIndex: SearchIndex<UserId>;\n private contactsFillPromise: CancellablePromise<AppUsersManager['contactsList']>;\n private contactsList: Set<UserId>;\n private updatedContactsList: boolean;\n \n private getTopPeersPromises: {[type in TopPeerType]?: Promise<MyTopPeer[]>};\n\n constructor() {\n this.clear(true);\n\n setInterval(this.updateUsersStatuses, 60000);\n\n rootScope.addEventListener('state_synchronized', this.updateUsersStatuses);\n\n rootScope.addMultipleEventsListeners({\n updateUserStatus: (update) => {\n const userId = update.user_id;\n const user = this.users[userId];\n if(user) {\n user.status = update.status;\n if(user.status) {\n if('expires' in user.status) {\n user.status.expires -= serverTimeManager.serverTimeOffset;\n }\n\n if('was_online' in user.status) {\n user.status.was_online -= serverTimeManager.serverTimeOffset;\n }\n }\n\n //user.sortStatus = this.getUserStatusForSort(user.status);\n rootScope.dispatchEvent('user_update', userId);\n this.setUserToStateIfNeeded(user);\n } //////else console.warn('No user by id:', userId);\n },\n\n updateUserPhoto: (update) => {\n const userId = update.user_id;\n const user = this.users[userId];\n if(user) {\n if((user.photo as UserProfilePhoto.userProfilePhoto)?.photo_id === (update.photo as UserProfilePhoto.userProfilePhoto).photo_id) {\n return;\n }\n\n this.forceUserOnline(userId, update.date);\n\n if(update.photo._ === 'userProfilePhotoEmpty') {\n delete user.photo;\n } else {\n user.photo = safeReplaceObject(user.photo, update.photo);\n }\n\n this.setUserToStateIfNeeded(user);\n\n rootScope.dispatchEvent('user_update', userId);\n rootScope.dispatchEvent('avatar_update', userId.toPeerId());\n } else console.warn('No user by id:', userId);\n },\n\n updateUserName: (update) => {\n const userId = update.user_id;\n const user = this.users[userId];\n if(user) {\n this.forceUserOnline(userId);\n \n this.saveApiUser(Object.assign({}, user, {\n first_name: update.first_name,\n last_name: update.last_name,\n username: update.username\n }), true);\n }\n }\n });\n\n /* case 'updateContactLink':\n this.onContactUpdated(update.user_id, update.my_link._ === 'contactLinkContact');\n break; */\n\n rootScope.addEventListener('language_change', (e) => {\n const userId = this.getSelf().id;\n this.contactsIndex.indexObject(userId, this.getUserSearchText(userId));\n });\n\n appStateManager.getState().then((state) => {\n const users = appStateManager.storagesResults.users;\n if(users.length) {\n for(let i = 0, length = users.length; i < length; ++i) {\n const user = users[i];\n if(user) {\n this.users[user.id] = user;\n this.setUserNameToCache(user);\n }\n }\n }\n\n const contactsList = state.contactsList;\n if(contactsList && Array.isArray(contactsList)) {\n contactsList.forEach(userId => {\n this.pushContact(userId);\n });\n\n if(contactsList.length) {\n this.contactsFillPromise = deferredPromise();\n this.contactsFillPromise.resolve(this.contactsList);\n }\n }\n\n appStateManager.addEventListener('peerNeeded', (peerId) => {\n if(!appPeersManager.isUser(peerId)) {\n return;\n }\n \n const userId = peerId.toUserId();\n if(!this.storage.getFromCache(userId)) {\n this.storage.set({\n [userId]: this.getUser(userId)\n });\n }\n });\n\n appStateManager.addEventListener('peerUnneeded', (peerId) => {\n if(!appPeersManager.isUser(peerId)) {\n return;\n }\n\n const userId = peerId.toUserId();\n if(this.storage.getFromCache(userId)) {\n this.storage.delete(userId);\n }\n });\n });\n }\n\n public clear(init = false) {\n if(!init) {\n const users = appStateManager.storagesResults.users;\n for(const userId in this.users) {\n // const userId = +userId;\n if(!userId) continue;\n const peerId = userId.toPeerId();\n if(!appStateManager.isPeerNeeded(peerId)) {\n const user = this.users[userId];\n if(user.username) {\n delete this.usernames[cleanUsername(user.username)];\n }\n\n users.findAndSplice((user) => user.id === userId);\n this.storage.delete(userId);\n delete this.users[userId];\n }\n }\n } else {\n this.users = {};\n this.usernames = {};\n }\n \n this.getTopPeersPromises = {};\n this.contactsIndex = this.createSearchIndex();\n this.contactsFillPromise = undefined;\n this.contactsList = new Set();\n this.updatedContactsList = false;\n }\n\n private onContactsModified() {\n const contactsList = [...this.contactsList];\n appStateManager.pushToState('contactsList', contactsList);\n }\n\n public fillContacts() {\n if(this.contactsFillPromise && this.updatedContactsList) {\n return {\n cached: this.contactsFillPromise.isFulfilled,\n promise: this.contactsFillPromise\n };\n }\n\n this.updatedContactsList = true;\n\n const promise = deferredPromise<Set<UserId>>();\n apiManager.invokeApi('contacts.getContacts').then((result) => {\n if(result._ === 'contacts.contacts') {\n this.contactsList.clear();\n \n this.saveApiUsers(result.users);\n\n result.contacts.forEach((contact) => {\n this.pushContact(contact.user_id);\n });\n\n this.onContactsModified();\n\n this.contactsFillPromise = promise;\n }\n\n promise.resolve(this.contactsList);\n }, () => {\n this.updatedContactsList = false;\n });\n\n return {\n cached: this.contactsFillPromise?.isFulfilled,\n promise: this.contactsFillPromise || (this.contactsFillPromise = promise)\n };\n }\n\n public resolveUsername(username: string): Promise<Chat | User> {\n if(username[0] === '@') {\n username = username.slice(1);\n }\n\n username = username.toLowerCase();\n if(this.usernames[username]) {\n return Promise.resolve(this.users[this.usernames[username]]);\n }\n\n return apiManager.invokeApi('contacts.resolveUsername', {username}).then(resolvedPeer => {\n this.saveApiUsers(resolvedPeer.users);\n appChatsManager.saveApiChats(resolvedPeer.chats);\n\n return appPeersManager.getPeer(appPeersManager.getPeerId(resolvedPeer.peer));\n });\n }\n\n public pushContact(id: UserId) {\n this.contactsList.add(id);\n this.contactsIndex.indexObject(id, this.getUserSearchText(id));\n appStateManager.requestPeerSingle(id.toPeerId(), 'contact');\n }\n\n public popContact(id: UserId) {\n this.contactsList.delete(id);\n this.contactsIndex.indexObject(id, ''); // delete search index\n appStateManager.releaseSinglePeer(id.toPeerId(), 'contact');\n }\n\n public getUserSearchText(id: UserId) {\n const user = this.users[id];\n if(!user) {\n return '';\n }\n\n const arr: string[] = [\n user.first_name,\n user.last_name,\n user.phone,\n user.username,\n user.pFlags.self ? I18n.format('SavedMessages', true) : '',\n user.pFlags.self ? 'Saved Messages' : ''\n ];\n\n return arr.filter(Boolean).join(' ');\n }\n\n public getContacts(query?: string, includeSaved = false, sortBy: 'name' | 'online' | 'none' = 'name') {\n return this.fillContacts().promise.then(_contactsList => {\n let contactsList = [..._contactsList];\n if(query) {\n const results = this.contactsIndex.search(query);\n const filteredContactsList = [...contactsList].filter(id => results.has(id));\n\n contactsList = filteredContactsList;\n }\n\n if(sortBy === 'name') {\n contactsList.sort((userId1, userId2) => {\n const sortName1 = (this.users[userId1] || {}).sortName || '';\n const sortName2 = (this.users[userId2] || {}).sortName || '';\n return sortName1.localeCompare(sortName2);\n });\n } else if(sortBy === 'online') {\n contactsList.sort((userId1, userId2) => {\n const status1 = appUsersManager.getUserStatusForSort(appUsersManager.getUser(userId1).status);\n const status2 = appUsersManager.getUserStatusForSort(appUsersManager.getUser(userId2).status);\n return status2 - status1;\n });\n }\n\n const myUserId = rootScope.myId.toUserId();\n indexOfAndSplice(contactsList, myUserId);\n if(includeSaved) {\n if(this.testSelfSearch(query)) {\n contactsList.unshift(myUserId);\n }\n }\n\n return contactsList;\n });\n }\n\n public getContactsPeerIds(\n query?: Parameters<AppUsersManager['getContacts']>[0], \n includeSaved?: Parameters<AppUsersManager['getContacts']>[1], \n sortBy?: Parameters<AppUsersManager['getContacts']>[2]) {\n return this.getContacts(query, includeSaved, sortBy).then(userIds => {\n return userIds.map(userId => userId.toPeerId(false));\n });\n }\n\n public toggleBlock(peerId: PeerId, block: boolean) {\n return apiManager.invokeApiSingle(block ? 'contacts.block' : 'contacts.unblock', {\n id: appPeersManager.getInputPeerById(peerId)\n }).then(value => {\n if(value) {\n apiUpdatesManager.processLocalUpdate({\n _: 'updatePeerBlocked',\n peer_id: appPeersManager.getOutputPeer(peerId),\n blocked: block\n });\n }\n\n return value;\n });\n }\n\n public testSelfSearch(query: string) {\n const user = this.getSelf();\n const index = this.createSearchIndex();\n index.indexObject(user.id, this.getUserSearchText(user.id));\n return index.search(query).has(user.id);\n }\n\n private createSearchIndex() {\n return new SearchIndex<UserId>({\n clearBadChars: true,\n ignoreCase: true,\n latinize: true,\n includeTag: true\n });\n }\n\n public saveApiUsers(apiUsers: MTUser[], override?: boolean) {\n if((apiUsers as any).saved) return;\n (apiUsers as any).saved = true;\n apiUsers.forEach((user) => this.saveApiUser(user, override));\n }\n\n private setUserNameToCache(user: MTUser.user, oldUser?: MTUser.user) {\n if(!oldUser || oldUser.username !== user.username) {\n if(oldUser?.username) {\n const oldSearchUsername = cleanUsername(oldUser.username);\n delete this.usernames[oldSearchUsername];\n }\n\n if(user.username) {\n const searchUsername = cleanUsername(user.username);\n this.usernames[searchUsername] = user.id;\n }\n }\n }\n\n public saveApiUser(user: MTUser, override?: boolean) {\n if(user._ === 'userEmpty') return;\n\n const userId = user.id;\n const oldUser = this.users[userId];\n\n // ! commented block can affect performance !\n // if(oldUser && !override) {\n // console.log('saveApiUser same');\n // return;\n // }\n\n if(user.pFlags === undefined) {\n user.pFlags = {};\n }\n\n if(user.pFlags.min && oldUser !== undefined) {\n return;\n }\n\n // * exclude from state\n // defineNotNumerableProperties(user, ['initials', 'num', 'rFirstName', 'rFullName', 'rPhone', 'sortName', 'sortStatus']);\n\n this.setUserNameToCache(user, oldUser);\n\n if(!oldUser \n || oldUser.initials === undefined \n || oldUser.sortName === undefined \n || oldUser.first_name !== user.first_name \n || oldUser.last_name !== user.last_name) {\n const fullName = user.first_name + (user.last_name ? ' ' + user.last_name : '');\n\n user.sortName = user.pFlags.deleted ? '' : cleanSearchText(fullName, false); \n user.initials = RichTextProcessor.getAbbreviation(fullName);\n } else {\n user.sortName = oldUser.sortName;\n user.initials = oldUser.initials;\n }\n\n if(user.status) {\n if((user.status as UserStatus.userStatusOnline).expires) {\n (user.status as UserStatus.userStatusOnline).expires -= serverTimeManager.serverTimeOffset;\n }\n\n if((user.status as UserStatus.userStatusOffline).was_online) {\n (user.status as UserStatus.userStatusOffline).was_online -= serverTimeManager.serverTimeOffset;\n }\n }\n\n //user.sortStatus = user.pFlags.bot ? -1 : this.getUserStatusForSort(user.status);\n\n let changedPhoto = false, changedTitle = false;\n if(oldUser === undefined) {\n this.users[userId] = user;\n } else {\n if(user.first_name !== oldUser.first_name \n || user.last_name !== oldUser.last_name \n || user.username !== oldUser.username) {\n changedTitle = true;\n }\n\n const oldPhotoId = (oldUser.photo as UserProfilePhoto.userProfilePhoto)?.photo_id;\n const newPhotoId = (user.photo as UserProfilePhoto.userProfilePhoto)?.photo_id;\n if(oldPhotoId !== newPhotoId) {\n changedPhoto = true;\n }\n\n /* if(user.pFlags.bot && user.bot_info_version !== oldUser.bot_info_version) {\n \n } */\n\n const wasContact = !!oldUser.pFlags.contact;\n const newContact = !!user.pFlags.contact;\n\n safeReplaceObject(oldUser, user);\n rootScope.dispatchEvent('user_update', userId);\n\n if(wasContact !== newContact) {\n this.onContactUpdated(userId, newContact, wasContact);\n }\n }\n\n if(changedPhoto) {\n rootScope.dispatchEvent('avatar_update', user.id.toPeerId());\n }\n\n if(changedTitle) {\n rootScope.dispatchEvent('peer_title_edit', user.id.toPeerId());\n }\n\n this.setUserToStateIfNeeded(user);\n }\n\n public setUserToStateIfNeeded(user: User) {\n if(appStateManager.isPeerNeeded(user.id.toPeerId())) {\n this.storage.set({\n [user.id]: user\n });\n }\n }\n\n public formatUserPhone(phone: string) {\n return '+' + formatPhoneNumber(phone).formatted;\n }\n\n public isUserOnlineVisible(id: UserId) {\n return this.getUserStatusForSort(id) > 3;\n }\n\n public getUserStatusForSort(status: User['status'] | UserId) {\n if(typeof(status) !== 'object') {\n status = this.getUser(status).status;\n }\n\n if(status) {\n const expires = status._ === 'userStatusOnline' ? status.expires : (status._ === 'userStatusOffline' ? status.was_online : 0);\n if(expires) {\n return expires;\n }\n\n /* const timeNow = tsNow(true);\n switch(status._) {\n case 'userStatusRecently':\n return timeNow - 86400 * 3;\n case 'userStatusLastWeek':\n return timeNow - 86400 * 7;\n case 'userStatusLastMonth':\n return timeNow - 86400 * 30;\n } */\n switch(status._) {\n case 'userStatusRecently':\n return 3;\n case 'userStatusLastWeek':\n return 2;\n case 'userStatusLastMonth':\n return 1;\n }\n }\n\n return 0;\n }\n\n public getUser(id: User | UserId) {\n if(isObject<User>(id)) {\n return id;\n }\n\n return this.users[id] || {id, pFlags: {deleted: true}, access_hash: ''} as User;\n }\n\n public getSelf() {\n return this.getUser(rootScope.myId);\n }\n\n public getUserStatusString(id: UserId): HTMLElement {\n let key: LangPackKey;\n let args: any[];\n\n switch(id) {\n case REPLIES_PEER_ID:\n key = 'Peer.RepliesNotifications';\n break;\n case SERVICE_PEER_ID:\n key = 'Peer.ServiceNotifications';\n break;\n default: {\n if(this.isBot(id)) {\n key = 'Bot';\n break;\n }\n\n const user = this.getUser(id);\n if(!user) {\n key = '' as any;\n break;\n }\n\n if(user.pFlags.support) {\n key = 'SupportStatus';\n break;\n }\n\n switch(user.status?._) {\n case 'userStatusRecently': {\n key = 'Lately';\n break;\n }\n \n case 'userStatusLastWeek': {\n key = 'WithinAWeek';\n break;\n }\n \n case 'userStatusLastMonth': {\n key = 'WithinAMonth';\n break;\n }\n \n case 'userStatusOffline': {\n const date = user.status.was_online;\n const today = new Date();\n const now = today.getTime() / 1000 | 0;\n \n const diff = now - date;\n if(diff < 60) {\n key = 'Peer.Status.justNow';\n } else if(diff < 3600) {\n key = 'Peer.Status.minAgo';\n const c = diff / 60 | 0;\n args = [c];\n } else if(diff < 86400 && today.getDate() === new Date(date * 1000).getDate()) {\n key = 'LastSeen.HoursAgo';\n const c = diff / 3600 | 0;\n args = [c];\n } else {\n key = 'Peer.Status.LastSeenAt';\n const {dateEl, timeEl} = formatFullSentTimeRaw(date);\n args = [dateEl, timeEl];\n }\n \n break;\n }\n \n case 'userStatusOnline': {\n key = 'Online';\n break;\n }\n \n default: {\n key = 'ALongTimeAgo';\n break;\n }\n }\n\n break;\n }\n }\n \n return i18n(key, args);\n }\n\n public isBot(id: UserId) {\n return this.users[id] && !!this.users[id].pFlags.bot;\n }\n\n public isContact(id: UserId) {\n return this.contactsList.has(id) || !!(this.users[id] && this.users[id].pFlags.contact);\n }\n \n public isRegularUser(id: UserId) {\n const user = this.users[id];\n return user && !this.isBot(id) && !user.pFlags.deleted && !user.pFlags.support;\n }\n\n public isNonContactUser(id: UserId) {\n return this.isRegularUser(id) && !this.isContact(id) && id.toPeerId() !== rootScope.myId;\n }\n\n public hasUser(id: UserId, allowMin?: boolean) {\n const user = this.users[id];\n return isObject(user) && (allowMin || !user.pFlags.min);\n }\n\n public canSendToUser(id: UserId) {\n const user = this.getUser(id);\n return !user.pFlags.deleted && user.id.toPeerId() !== REPLIES_PEER_ID;\n }\n\n public getUserPhoto(id: UserId) {\n const user = this.getUser(id);\n\n return user && user.photo || {\n _: 'userProfilePhotoEmpty'\n };\n }\n\n public getUserString(id: UserId) {\n const user = this.getUser(id);\n return 'u' + id + (user.access_hash ? '_' + user.access_hash : '');\n }\n\n public getUserInput(id: UserId): InputUser {\n const user = this.getUser(id);\n if(user.pFlags && user.pFlags.self) {\n return {_: 'inputUserSelf'};\n }\n\n return {\n _: 'inputUser',\n user_id: id,\n access_hash: user.access_hash\n };\n }\n\n public getUserInputPeer(id: UserId): InputPeer.inputPeerSelf | InputPeer.inputPeerUser {\n const user = this.getUser(id);\n if(user.pFlags && user.pFlags.self) {\n return {_: 'inputPeerSelf'};\n }\n\n return {\n _: 'inputPeerUser',\n user_id: id,\n access_hash: user.access_hash\n };\n }\n\n public getContactMediaInput(id: UserId): InputMedia.inputMediaContact {\n const user = this.getUser(id);\n\n return {\n _: 'inputMediaContact',\n first_name: user.first_name,\n last_name: user.last_name,\n phone_number: user.phone,\n vcard: '',\n user_id: id\n };\n }\n\n public updateUsersStatuses = () => {\n const timestampNow = tsNow(true);\n for(const i in this.users) {\n const user = this.users[i];\n this.updateUserStatus(user, timestampNow);\n }\n };\n\n public updateUserStatus(user: MTUser.user, timestampNow = tsNow(true)) {\n if(user.status &&\n user.status._ === 'userStatusOnline' &&\n user.status.expires < timestampNow) {\n user.status = {_: 'userStatusOffline', was_online: user.status.expires};\n rootScope.dispatchEvent('user_update', user.id);\n\n this.setUserToStateIfNeeded(user);\n }\n }\n\n public forceUserOnline(id: UserId, eventTimestamp?: number) {\n if(this.isBot(id)) {\n return;\n }\n\n const timestamp = tsNow(true);\n const onlineTimeFor = 60;\n if(eventTimestamp) {\n if((timestamp - eventTimestamp) >= onlineTimeFor) {\n return;\n }\n } else if(apiUpdatesManager.updatesState.syncLoading) {\n return;\n }\n\n const user = this.getUser(id);\n if(user &&\n user.status &&\n user.status._ !== 'userStatusOnline' &&\n user.status._ !== 'userStatusEmpty' &&\n !user.pFlags.support &&\n !user.pFlags.deleted) {\n\n user.status = {\n _: 'userStatusOnline',\n expires: timestamp + onlineTimeFor\n };\n \n //user.sortStatus = this.getUserStatusForSort(user.status);\n rootScope.dispatchEvent('user_update', id);\n\n this.setUserToStateIfNeeded(user);\n }\n }\n\n public importContact(first_name: string, last_name: string, phone: string) {\n return this.importContacts([{\n first_name,\n last_name,\n phones: [phone]\n }]).then(userIds => {\n if(!userIds.length) {\n const error = new Error();\n (error as any).type = 'NO_USER';\n throw error;\n }\n\n return userIds[0];\n });\n }\n\n public importContacts(contacts: {phones: string[], first_name: string, last_name: string}[]) {\n const inputContacts: InputContact[] = [];\n\n for(let i = 0; i < contacts.length; ++i) {\n for(let j = 0; j < contacts[i].phones.length; ++j) {\n inputContacts.push({\n _: 'inputPhoneContact',\n client_id: (i << 16 | j).toString(10),\n phone: contacts[i].phones[j],\n first_name: contacts[i].first_name,\n last_name: contacts[i].last_name\n });\n }\n }\n\n return apiManager.invokeApi('contacts.importContacts', {\n contacts: inputContacts\n }).then((importedContactsResult) => {\n this.saveApiUsers(importedContactsResult.users);\n\n const userIds = importedContactsResult.imported.map((importedContact) => {\n this.onContactUpdated(importedContact.user_id, true);\n return importedContact.user_id;\n });\n\n return userIds;\n });\n }\n\n public getTopPeers(type: TopPeerType) {\n if(this.getTopPeersPromises[type]) return this.getTopPeersPromises[type];\n\n return this.getTopPeersPromises[type] = appStateManager.getState().then((state) => {\n const cached = state.topPeersCache[type];\n if(cached && (cached.cachedTime + 86400e3) > Date.now() && cached.peers) {\n return cached.peers;\n }\n\n return apiManager.invokeApi('contacts.getTopPeers', {\n [type]: true,\n offset: 0,\n limit: 15,\n hash: '0'\n }).then((result) => {\n let topPeers: MyTopPeer[] = [];\n if(result._ === 'contacts.topPeers') {\n //console.log(result);\n this.saveApiUsers(result.users);\n appChatsManager.saveApiChats(result.chats);\n\n if(result.categories.length) {\n topPeers = result.categories[0].peers.map((topPeer) => {\n const peerId = appPeersManager.getPeerId(topPeer.peer);\n appStateManager.requestPeer(peerId, 'topPeer');\n return {id: peerId, rating: topPeer.rating};\n });\n }\n }\n \n state.topPeersCache[type] = {\n peers: topPeers,\n cachedTime: Date.now()\n };\n appStateManager.pushToState('topPeersCache', state.topPeersCache);\n \n return topPeers;\n });\n });\n }\n\n public getBlocked(offset = 0, limit = 0) {\n return apiManager.invokeApiSingle('contacts.getBlocked', {offset, limit}).then(contactsBlocked => {\n this.saveApiUsers(contactsBlocked.users);\n appChatsManager.saveApiChats(contactsBlocked.chats);\n const count = contactsBlocked._ === 'contacts.blocked' ? contactsBlocked.users.length + contactsBlocked.chats.length : contactsBlocked.count;\n\n const peerIds: PeerId[] = contactsBlocked.users.map(u => u.id.toPeerId()).concat(contactsBlocked.chats.map(c => c.id.toPeerId(true)));\n\n return {count, peerIds};\n });\n }\n\n public getLocated(\n lat: number, \n long: number,\n accuracy_radius: number,\n background: boolean = false,\n self_expires: number = 0\n ) {\n const geo_point: InputGeoPoint = {\n _: 'inputGeoPoint',\n lat,\n long,\n accuracy_radius\n };\n\n return apiManager.invokeApi('contacts.getLocated', {\n geo_point, \n background\n }).then((updates) => {\n apiUpdatesManager.processUpdateMessage(updates);\n return updates;\n });\n }\n\n /* public searchContacts(query: string, limit = 20) {\n return Promise.all([\n this.getContacts(query),\n apiManager.invokeApi('contacts.search', {\n q: query,\n limit\n })\n ]).then(results => {\n const [myContacts, peers] = results;\n\n this.saveApiUsers(peers.users);\n appChatsManager.saveApiChats(peers.chats);\n\n // * contacts.search returns duplicates in my_results\n const myResults = new Set(myContacts.concat(peers.my_results.map(p => appPeersManager.getPeerID(p))));\n\n const out = {\n my_results: [...myResults].slice(0, limit),\n results: peers.results.map(p => appPeersManager.getPeerID(p))\n };\n\n return out;\n });\n } */\n public searchContacts(query: string, limit = 20) {\n return apiManager.invokeApiCacheable('contacts.search', {\n q: query,\n limit\n }, {cacheSeconds: 60}).then(peers => {\n this.saveApiUsers(peers.users);\n appChatsManager.saveApiChats(peers.chats);\n\n const out = {\n my_results: filterUnique(peers.my_results.map(p => appPeersManager.getPeerId(p))), // ! contacts.search returns duplicates in my_results\n results: peers.results.map(p => appPeersManager.getPeerId(p))\n };\n\n return out;\n });\n }\n\n private onContactUpdated(userId: UserId, isContact: boolean, curIsContact = this.isContact(userId)) {\n if(isContact !== curIsContact) {\n if(isContact) {\n this.pushContact(userId);\n } else {\n this.popContact(userId);\n }\n\n this.onContactsModified();\n\n rootScope.dispatchEvent('contacts_update', userId);\n }\n }\n\n public updateUsername(username: string) {\n return apiManager.invokeApi('account.updateUsername', {\n username\n }).then((user) => {\n this.saveApiUser(user);\n });\n }\n\n public setUserStatus(userId: UserId, offline: boolean) {\n if(this.isBot(userId)) {\n return;\n }\n\n const user = this.users[userId];\n if(user) {\n const status: UserStatus = offline ? {\n _: 'userStatusOffline',\n was_online: tsNow(true)\n } : {\n _: 'userStatusOnline',\n expires: tsNow(true) + 50\n };\n\n user.status = status;\n //user.sortStatus = this.getUserStatusForSort(user.status);\n rootScope.dispatchEvent('user_update', userId);\n\n this.setUserToStateIfNeeded(user);\n }\n }\n\n public addContact(userId: UserId, first_name: string, last_name: string, phone: string, showPhone?: true) {\n /* if(!userId) {\n return this.importContacts([{\n first_name,\n last_name,\n phones: [phone]\n }]);\n } */\n\n return apiManager.invokeApi('contacts.addContact', {\n id: this.getUserInput(userId),\n first_name,\n last_name,\n phone,\n add_phone_privacy_exception: showPhone\n }).then((updates) => {\n apiUpdatesManager.processUpdateMessage(updates, {override: true});\n\n this.onContactUpdated(userId, true);\n });\n }\n\n public deleteContacts(userIds: UserId[]) {\n return apiManager.invokeApi('contacts.deleteContacts', {\n id: userIds.map(userId => this.getUserInput(userId))\n }).then((updates) => {\n apiUpdatesManager.processUpdateMessage(updates, {override: true});\n\n userIds.forEach(userId => {\n this.onContactUpdated(userId, false);\n });\n });\n }\n}\n\nconst appUsersManager = new AppUsersManager();\nMOUNT_CLASS_TO.appUsersManager = appUsersManager;\nexport default appUsersManager\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov <igor.beatle@gmail.com>\n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport type { Chat, DialogPeer, Message, MessagesPeerDialogs, Update } from \"../../layer\";\nimport type { AppChatsManager } from \"../appManagers/appChatsManager\";\nimport type { AppMessagesManager, Dialog, MyMessage } from \"../appManagers/appMessagesManager\";\nimport type { AppPeersManager } from \"../appManagers/appPeersManager\";\nimport type { AppUsersManager } from \"../appManagers/appUsersManager\";\nimport type { AppDraftsManager } from \"../appManagers/appDraftsManager\";\nimport type { AppNotificationsManager } from \"../appManagers/appNotificationsManager\";\nimport type { ApiUpdatesManager } from \"../appManagers/apiUpdatesManager\";\nimport type { ServerTimeManager } from \"../mtproto/serverTimeManager\";\nimport type { AppMessagesIdsManager } from \"../appManagers/appMessagesIdsManager\";\nimport { tsNow } from \"../../helpers/date\";\nimport apiManager from \"../mtproto/mtprotoworker\";\nimport SearchIndex from \"../searchIndex\";\nimport { forEachReverse, indexOfAndSplice, insertInDescendSortedArray } from \"../../helpers/array\";\nimport rootScope from \"../rootScope\";\nimport { defineNotNumerableProperties, safeReplaceObject } from \"../../helpers/object\";\nimport { AppStateManager } from \"../appManagers/appStateManager\";\nimport { SliceEnd } from \"../../helpers/slicedArray\";\nimport { MyDialogFilter } from \"./filters\";\nimport { NULL_PEER_ID } from \"../mtproto/mtproto_config\";\nimport { NoneToVoidFunction } from \"../../types\";\nimport ctx from \"../../environment/ctx\";\nimport AppStorage from \"../storage\";\nimport type DATABASE_STATE from \"../../config/databases/state\";\n\nexport type FolderDialog = {\n dialog: Dialog,\n index: number\n};\n\nexport type Folder = {\n dialogs: Dialog[],\n id: number,\n unreadMessagesCount: number,\n unreadDialogsCount: number,\n dispatchUnreadTimeout?: number\n};\n\nexport const GLOBAL_FOLDER_ID: number = undefined;\n\n// let spentTime = 0;\nexport default class DialogsStorage {\n private storage: AppStateManager['storages']['dialogs'];\n \n private dialogs: {[peerId: PeerId]: Dialog};\n\n private folders: {[folderId: number]: Folder} = {};\n\n private allDialogsLoaded: {[folder_id: number]: boolean};\n private dialogsOffsetDate: {[folder_id: number]: number};\n private pinnedOrders: {[folder_id: number]: PeerId[]};\n private dialogsNum: number;\n\n private dialogsIndex: SearchIndex<PeerId>;\n\n private cachedResults: {\n query: string,\n count: number,\n dialogs: Dialog[],\n folderId: number\n };\n\n constructor(\n private appMessagesManager: AppMessagesManager, \n private appChatsManager: AppChatsManager, \n private appPeersManager: AppPeersManager, \n private appUsersManager: AppUsersManager,\n private appDraftsManager: AppDraftsManager,\n private appNotificationsManager: AppNotificationsManager,\n private appStateManager: AppStateManager,\n private apiUpdatesManager: ApiUpdatesManager,\n private serverTimeManager: ServerTimeManager,\n private appMessagesIdsManager: AppMessagesIdsManager\n ) {\n this.storage = this.appStateManager.storages.dialogs;\n this.dialogs = this.storage.getCache();\n this.clear(true);\n\n rootScope.addEventListener('language_change', () => {\n const peerId = appUsersManager.getSelf().id.toPeerId(false);\n const dialog = this.getDialogOnly(peerId);\n if(dialog) {\n const peerText = appPeersManager.getPeerSearchText(peerId);\n this.dialogsIndex.indexObject(peerId, peerText);\n }\n });\n\n const onFilterUpdate = (filter: MyDialogFilter) => {\n const dialogs = this.getCachedDialogs(false);\n for(let i = 0; i < dialogs.length; ++i) {\n this.processDialogForFilter(dialogs[i], filter);\n }\n };\n\n rootScope.addEventListener('filter_order', () => {\n const dialogs = this.getCachedDialogs(false);\n for(const filterId in this.folders) {\n if(+filterId > 1) {\n delete this.folders[filterId];\n }\n }\n\n for(let i = 0; i < dialogs.length; ++i) {\n const dialog = dialogs[i];\n for(let i = 0; i <= 10; ++i) {\n const indexKey = `index_${i}` as ReturnType<DialogsStorage['getDialogIndexKey']>;\n dialog[indexKey] = undefined;\n }\n\n this.processDialogForFilters(dialog);\n }\n });\n\n rootScope.addEventListener('filter_update', onFilterUpdate);\n rootScope.addEventListener('filter_new', onFilterUpdate);\n\n rootScope.addEventListener('filter_delete', (filter) => {\n const dialogs = this.getCachedDialogs(false);\n\n const indexKey = `index_${filter.orderIndex}` as const;\n for(let i = 0; i < dialogs.length; ++i) {\n const dialog = dialogs[i];\n delete dialog[indexKey];\n }\n\n delete this.folders[filter.id];\n });\n\n rootScope.addEventListener('chat_update', (chatId) => {\n const chat: Chat.chat = this.appChatsManager.getChat(chatId);\n\n const peerId = chatId.toPeerId(true);\n if(chat.pFlags.left && this.getDialogOnly(peerId)) {\n this.dropDialogOnDeletion(peerId);\n }\n });\n\n rootScope.addMultipleEventsListeners({\n updateFolderPeers: this.onUpdateFolderPeers,\n\n updateDialogPinned: this.onUpdateDialogPinned,\n\n updatePinnedDialogs: this.onUpdatePinnedDialogs,\n });\n\n appStateManager.getState().then((state) => {\n this.pinnedOrders = state.pinnedOrders || {};\n if(!this.pinnedOrders[0]) this.pinnedOrders[0] = [];\n if(!this.pinnedOrders[1]) this.pinnedOrders[1] = [];\n \n const dialogs = appStateManager.storagesResults.dialogs;\n if(dialogs.length) {\n AppStorage.freezeSaving<typeof DATABASE_STATE>(this.setDialogsFromState.bind(this, dialogs), ['chats', 'dialogs', 'messages', 'users']);\n }\n\n this.allDialogsLoaded = state.allDialogsLoaded || {};\n });\n }\n\n private setDialogsFromState(dialogs: Dialog[]) {\n for(let i = 0, length = dialogs.length; i < length; ++i) {\n const dialog = dialogs[i];\n if(dialog) {\n // if(dialog.peerId !== SERVICE_PEER_ID) {\n dialog.top_message = this.appMessagesIdsManager.getServerMessageId(dialog.top_message); // * fix outgoing message to avoid copying dialog\n // }\n\n if(dialog.topMessage) {\n this.appMessagesManager.saveMessages([dialog.topMessage]);\n }\n\n for(let i = 0; i <= 10; ++i) {\n // @ts-ignore\n delete dialog[`index_${i}`];\n }\n\n this.saveDialog(dialog, undefined, true);\n\n // ! WARNING, убрать это когда нужно будет делать чтобы pending сообщения сохранялись\n const message = this.appMessagesManager.getMessageByPeer(dialog.peerId, dialog.top_message);\n if(message.deleted) {\n this.appMessagesManager.reloadConversation(dialog.peerId);\n }\n }\n }\n }\n\n public isDialogsLoaded(folderId: number) {\n return !!this.allDialogsLoaded[folderId];\n }\n\n public setDialogsLoaded(folderId: number, loaded: boolean) {\n if(folderId === GLOBAL_FOLDER_ID && loaded) {\n this.allDialogsLoaded[0] = loaded;\n this.allDialogsLoaded[1] = loaded;\n } else {\n this.allDialogsLoaded[folderId] = loaded;\n }\n\n if(this.allDialogsLoaded[0] && this.allDialogsLoaded[1]) {\n this.allDialogsLoaded[GLOBAL_FOLDER_ID] = true;\n }\n\n this.appStateManager.pushToState('allDialogsLoaded', this.allDialogsLoaded);\n }\n\n public clear(init = false) {\n this.pinnedOrders = {\n 0: [],\n 1: []\n };\n\n if(!init) {\n const dialogs = this.appStateManager.storagesResults.dialogs;\n dialogs.length = 0;\n this.storage.clear();\n\n this.setDialogsLoaded(0, false);\n this.setDialogsLoaded(1, false);\n this.setDialogsLoaded(GLOBAL_FOLDER_ID, false);\n this.savePinnedOrders();\n } else {\n this.allDialogsLoaded = {};\n }\n\n this.folders = {};\n this.dialogsOffsetDate = {};\n this.dialogsNum = 0;\n this.dialogsIndex = new SearchIndex({\n clearBadChars: true,\n ignoreCase: true,\n latinize: true,\n includeTag: true\n });\n this.cachedResults = {\n query: '',\n count: 0,\n dialogs: [],\n folderId: 0\n };\n }\n\n public handleDialogUnpinning(dialog: Dialog, folderId: number) {\n delete dialog.pFlags.pinned;\n indexOfAndSplice(this.pinnedOrders[folderId], dialog.peerId);\n this.savePinnedOrders();\n }\n\n public savePinnedOrders() {\n this.appStateManager.pushToState('pinnedOrders', this.pinnedOrders);\n }\n\n public resetPinnedOrder(folderId: number) {\n this.pinnedOrders[folderId] = [];\n }\n\n public getPinnedOrders(folderId: number) {\n return this.pinnedOrders[folderId];\n }\n\n public getOffsetDate(folderId: number): number {\n const offsetDate = this.dialogsOffsetDate[folderId] || 0;\n if(folderId === GLOBAL_FOLDER_ID && !offsetDate) { // make request not from beginning if we have loaded some dialogs\n return Math.min(this.getOffsetDate(0), this.getOffsetDate(1));\n }\n\n return offsetDate;\n }\n\n public getFolder(id: number) {\n return this.folders[id] ?? (this.folders[id] = {dialogs: [], id, unreadMessagesCount: 0, unreadDialogsCount: 0});\n }\n\n public getFolderDialogs(id: number, skipMigrated = true): Dialog[] {\n if(id === GLOBAL_FOLDER_ID) { // * it won't be sorted\n return this.getCachedDialogs(skipMigrated);\n }\n\n const folder = this.getFolder(id);\n return skipMigrated ? folder.dialogs.filter(dialog => dialog.migratedTo === undefined) : folder.dialogs;\n }\n\n public getCachedDialogs(skipMigrated?: boolean) {\n return this.getFolderDialogs(0, skipMigrated).concat(this.getFolderDialogs(1, skipMigrated));\n }\n\n private setDialogIndexInFilter(dialog: Dialog, indexKey: ReturnType<DialogsStorage['getDialogIndexKey']>, filter: MyDialogFilter) {\n let index: number;\n\n if(this.appMessagesManager.filtersStorage.testDialogForFilter(dialog, filter)) {\n const pinnedIndex = filter.pinnedPeerIds.indexOf(dialog.peerId);\n if(pinnedIndex !== -1) {\n index = this.generateDialogIndex(this.generateDialogPinnedDateByIndex(filter.pinned_peers.length - 1 - pinnedIndex), true);\n } else if(dialog.pFlags?.pinned) {\n index = this.generateIndexForDialog(dialog, true);\n } else {\n index = dialog.index;\n }\n }\n\n return dialog[indexKey] = index;\n }\n\n public getDialog(peerId: PeerId, folderId?: number, skipMigrated = true): [Dialog, number] | [] {\n const folders: Dialog[][] = [];\n\n if(folderId === undefined) {\n folders.push(this.getFolder(0).dialogs, this.getFolder(1).dialogs);\n } else {\n folders.push(this.getFolderDialogs(folderId, false));\n }\n\n for(let folder of folders) {\n let i = 0, skipped = 0;\n for(let length = folder.length; i < length; ++i) {\n const dialog = folder[i];\n if(dialog.peerId === peerId) {\n return [dialog, i - skipped];\n } else if(skipMigrated && dialog.migratedTo !== undefined) {\n ++skipped;\n }\n }\n }\n\n return [];\n }\n\n public getDialogOnly(peerId: PeerId) {\n return this.dialogs[peerId];\n }\n\n /*\n var date = Date.now() / 1000 | 0;\n var m = date * 0x10000;\n\n var k = (date + 1) * 0x10000;\n k - m;\n 65536\n */\n public generateDialogIndex(date?: number, isPinned?: boolean) {\n if(date === undefined) {\n date = tsNow(true) + this.serverTimeManager.serverTimeOffset;\n }\n\n return (date * 0x10000) + (isPinned ? 0 : ((++this.dialogsNum) & 0xFFFF));\n }\n\n public processDialogForFilters(dialog: Dialog) {\n // let perf = performance.now();\n const filters = this.appMessagesManager.filtersStorage.filters;\n for(const id in filters) {\n const filter = filters[id];\n this.processDialogForFilter(dialog, filter);\n }\n // spentTime += (performance.now() - perf);\n // console.log('generate index time:', spentTime);\n }\n\n public processDialogForFilter(dialog: Dialog, filter: MyDialogFilter) {\n const indexKey = this.getDialogIndexKey(filter.id);\n const folder = this.getFolder(filter.id);\n const dialogs = folder.dialogs;\n\n const wasIndex = dialogs.findIndex(d => d.peerId === dialog.peerId);\n const wasDialog = dialogs[wasIndex];\n const wasDialogIndex = wasDialog && wasDialog[indexKey];\n\n const newDialogIndex = this.setDialogIndexInFilter(dialog, indexKey, filter);\n\n if(wasDialogIndex === newDialogIndex) {\n return;\n }\n\n if((!wasDialogIndex && newDialogIndex) || (wasIndex && !newDialogIndex)) {\n this.prepareFolderUnreadCountModifyingByDialog(filter.id, dialog, !!newDialogIndex);\n }\n\n if(wasIndex !== -1) {\n dialogs.splice(wasIndex, 1);\n }\n\n if(newDialogIndex) {\n insertInDescendSortedArray(dialogs, dialog, indexKey, wasIndex);\n }\n }\n\n public prepareDialogUnreadCountModifying(dialog: Dialog) {\n const callbacks: NoneToVoidFunction[] = [\n this.prepareFolderUnreadCountModifyingByDialog(dialog.folder_id, dialog)\n ];\n\n const filters = this.appMessagesManager.filtersStorage.filters;\n for(const id in filters) {\n const filter = filters[id];\n if(this.appMessagesManager.filtersStorage.testDialogForFilter(dialog, filter)) {\n callbacks.push(this.prepareFolderUnreadCountModifyingByDialog(filter.id, dialog));\n }\n }\n\n return () => callbacks.forEach(callback => callback());\n }\n\n public prepareFolderUnreadCountModifyingByDialog(folderId: number, dialog: Dialog, toggle?: boolean) {\n const wasUnreadCount = this.appMessagesManager.getDialogUnreadCount(dialog);\n \n if(toggle !== undefined) {\n this.modifyFolderUnreadCount(folderId, toggle ? wasUnreadCount : -wasUnreadCount, wasUnreadCount ? (toggle ? 1 : -1) : 0);\n return;\n }\n\n return () => {\n const newUnreadCount = this.appMessagesManager.getDialogUnreadCount(dialog);\n const addMessagesCount = newUnreadCount - wasUnreadCount;\n const addDialogsCount = (newUnreadCount && !wasUnreadCount) || (!newUnreadCount && wasUnreadCount) ? (wasUnreadCount ? -1 : 1) : 0;\n this.modifyFolderUnreadCount(folderId, addMessagesCount, addDialogsCount);\n };\n }\n\n public modifyFolderUnreadCount(folderId: number, addMessagesCount: number, addDialogsCount: number) {\n if(!addMessagesCount && !addDialogsCount) {\n return;\n }\n\n const folder = this.getFolder(folderId);\n if(addMessagesCount) {\n folder.unreadMessagesCount = Math.max(0, folder.unreadMessagesCount + addMessagesCount);\n }\n \n if(addDialogsCount) {\n folder.unreadDialogsCount = Math.max(0, folder.unreadDialogsCount + addDialogsCount);\n }\n\n if(folder.dispatchUnreadTimeout === undefined) {\n folder.dispatchUnreadTimeout = ctx.setTimeout(() => {\n folder.dispatchUnreadTimeout = undefined;\n rootScope.dispatchEvent('folder_unread', folder);\n }, 0);\n }\n }\n\n public generateIndexForDialog(dialog: Dialog, justReturn = false, message?: MyMessage) {\n let topDate = 0, isPinned: boolean;\n if(dialog.pFlags.pinned && !justReturn) {\n topDate = this.generateDialogPinnedDate(dialog);\n isPinned = true;\n } else {\n if(!message) {\n message = this.appMessagesManager.getMessageByPeer(dialog.peerId, dialog.top_message);\n }\n \n topDate = (message as Message.message).date || topDate;\n\n const channelId = this.appPeersManager.isChannel(dialog.peerId) && dialog.peerId.toChatId();\n if(channelId) {\n const channel: Chat.channel = this.appChatsManager.getChat(channelId);\n if(!topDate || (channel.date && channel.date > topDate)) {\n topDate = channel.date;\n }\n }\n \n if(dialog.draft?._ === 'draftMessage' && dialog.draft.date > topDate) {\n topDate = dialog.draft.date;\n }\n }\n\n if(!topDate) {\n topDate = tsNow(true);\n }\n\n const index = this.generateDialogIndex(topDate, isPinned);\n if(justReturn) {\n return index;\n }\n\n dialog.index = index;\n }\n\n public generateDialogPinnedDateByIndex(pinnedIndex: number) {\n return 0x7fff0000 + (pinnedIndex & 0xFFFF); // 0xFFFF - потому что в папках может быть бесконечное число пиннедов\n }\n\n public generateDialogPinnedDate(dialog: Dialog) {\n const order = this.pinnedOrders[dialog.folder_id];\n\n const foundIndex = order.indexOf(dialog.peerId);\n let pinnedIndex = foundIndex;\n if(foundIndex === -1) {\n pinnedIndex = order.push(dialog.peerId) - 1;\n this.savePinnedOrders();\n }\n\n return this.generateDialogPinnedDateByIndex(pinnedIndex);\n }\n\n /* public generateDialog(peerId: PeerId) {\n const dialog: Dialog = {\n _: 'dialog',\n pFlags: {},\n peer: this.appPeersManager.getOutputPeer(peerId),\n top_message: 0,\n read_inbox_max_id: 0,\n read_outbox_max_id: 0,\n unread_count: 0,\n unread_mentions_count: 0,\n notify_settings: {\n _: 'peerNotifySettings',\n },\n };\n\n return dialog;\n } */\n\n public setDialogToState(dialog: Dialog) {\n const {peerId, pts} = dialog;\n const historyStorage = this.appMessagesManager.getHistoryStorage(peerId);\n const messagesStorage = this.appMessagesManager.getMessagesStorage(peerId);\n const history = historyStorage.history.slice;\n let incomingMessage: MyMessage;\n for(let i = 0, length = history.length; i < length; ++i) {\n const mid = history[i];\n const message: MyMessage = this.appMessagesManager.getMessageFromStorage(messagesStorage, mid);\n if(!message.pFlags.is_outgoing && !message.deleted/* || peerId === SERVICE_PEER_ID */) {\n incomingMessage = message;\n \n const fromId = message.viaBotId || message.fromId;\n if(fromId !== peerId) {\n this.appStateManager.requestPeerSingle(fromId, 'topMessage', peerId);\n }\n \n break;\n }\n }\n\n dialog.topMessage = incomingMessage;\n\n // DO NOT TOUCH THESE LINES, SOME REAL MAGIC HERE.\n // * Read service chat when refreshing page with outgoing & getting new service outgoing message\n /* if(incomingMessage && dialog.read_inbox_max_id >= dialog.top_message) {\n dialog.unread_count = 0;\n }\n\n dialog.read_inbox_max_id = this.appMessagesIdsManager.clearMessageId(dialog.read_inbox_max_id);\n dialog.read_outbox_max_id = this.appMessagesIdsManager.clearMessageId(dialog.read_outbox_max_id); */\n // CAN TOUCH NOW\n\n if(peerId.isAnyChat() && pts) {\n const newPts = this.apiUpdatesManager.getChannelState(peerId.toChatId(), pts).pts;\n dialog.pts = newPts;\n }\n\n this.storage.set({\n [peerId]: dialog\n });\n\n this.appStateManager.requestPeerSingle(peerId, 'dialog');\n\n /* for(let id in this.appMessagesManager.filtersStorage.filters) {\n const filter = this.appMessagesManager.filtersStorage.filters[id];\n\n if(this.appMessagesManager.filtersStorage.testDialogForFilter(dialog, filter)) {\n \n }\n } */\n }\n\n public pushDialog(dialog: Dialog, offsetDate?: number, ignoreOffsetDate?: boolean, saveGlobalOffset?: boolean) {\n const {folder_id, peerId} = dialog;\n const dialogs = this.getFolderDialogs(folder_id, false);\n const pos = dialogs.findIndex(d => d.peerId === peerId);\n if(pos !== -1) {\n dialogs.splice(pos, 1);\n }\n \n //if(!this.dialogs[peerId]) {\n this.dialogs[peerId] = dialog;\n \n this.setDialogToState(dialog);\n //}\n\n if(offsetDate === undefined) {\n offsetDate = this.getDialogOffsetDate(dialog);\n }\n\n this.processDialogForFilters(dialog);\n\n if(offsetDate && !dialog.pFlags.pinned) {\n if(saveGlobalOffset) {\n const savedGlobalOffsetDate = this.dialogsOffsetDate[GLOBAL_FOLDER_ID];\n if(!savedGlobalOffsetDate || offsetDate < savedGlobalOffsetDate) {\n this.dialogsOffsetDate[GLOBAL_FOLDER_ID] = offsetDate;\n }\n }\n\n const savedOffsetDate = this.dialogsOffsetDate[folder_id];\n if(!savedOffsetDate || offsetDate < savedOffsetDate) {\n // if(pos !== -1) {\n if(!ignoreOffsetDate && !this.isDialogsLoaded(folder_id)) {\n this.clearDialogFromState(dialog, true);\n return;\n }\n \n this.dialogsOffsetDate[folder_id] = offsetDate;\n }\n }\n\n if(pos === -1) {\n this.prepareFolderUnreadCountModifyingByDialog(folder_id, dialog, true);\n }\n\n /* const newPos = */insertInDescendSortedArray(dialogs, dialog, 'index', pos);\n /* if(pos !== -1 && pos !== newPos) {\n rootScope.dispatchEvent('dialog_order', {dialog, pos: newPos});\n } */\n }\n\n public dropDialog(peerId: PeerId): ReturnType<DialogsStorage['getDialog']> {\n const foundDialog = this.getDialog(peerId, undefined, false);\n const [dialog, index] = foundDialog;\n if(dialog) {\n delete this.dialogs[peerId];\n\n const folder = this.getFolder(dialog.folder_id);\n folder.dialogs.splice(index, 1);\n const wasPinned = indexOfAndSplice(this.pinnedOrders[dialog.folder_id], peerId) !== undefined;\n \n this.processDialogForFilters(dialog);\n\n this.dialogsIndex.indexObject(peerId, '');\n\n if(wasPinned) {\n this.savePinnedOrders();\n }\n\n this.clearDialogFromState(dialog, false);\n }\n\n return foundDialog;\n }\n\n public clearDialogFromState(dialog: Dialog, keepLocal: boolean) {\n const peerId = dialog.peerId;\n this.appStateManager.releaseSinglePeer(peerId, 'topMessage');\n this.appStateManager.releaseSinglePeer(peerId, 'dialog');\n this.storage.delete(peerId, keepLocal);\n }\n\n public dropDialogWithEvent(peerId: PeerId) {\n const dropped = this.dropDialog(peerId);\n if(dropped.length) {\n rootScope.dispatchEvent('dialog_drop', {peerId, dialog: dropped[0]});\n }\n\n return dropped;\n }\n\n /**\n * leaving chat, leaving channel, deleting private dialog\n */\n public dropDialogOnDeletion(peerId: PeerId) {\n this.dropDialogWithEvent(peerId);\n rootScope.dispatchEvent('peer_deleted', peerId);\n }\n\n public applyDialogs(dialogsResult: MessagesPeerDialogs.messagesPeerDialogs) {\n // * В эту функцию попадут только те диалоги, в которых есть read_inbox_max_id и read_outbox_max_id, в отличие от тех, что будут в getTopMessages\n\n // ! fix 'dialogFolder', maybe there is better way to do it, this only can happen by 'messages.getPinnedDialogs' by folder_id: 0\n forEachReverse(dialogsResult.dialogs, (dialog, idx) => {\n if(dialog._ === 'dialogFolder') {\n dialogsResult.dialogs.splice(idx, 1);\n }\n });\n\n this.appUsersManager.saveApiUsers(dialogsResult.users);\n this.appChatsManager.saveApiChats(dialogsResult.chats);\n this.appMessagesManager.saveMessages(dialogsResult.messages);\n\n // this.appMessagesManager.log('applyConversation', dialogsResult);\n\n const updatedDialogs: {[peerId: PeerId]: Dialog} = {};\n (dialogsResult.dialogs as Dialog[]).forEach((dialog) => {\n const peerId = this.appPeersManager.getPeerId(dialog.peer);\n let topMessage = dialog.top_message;\n\n const topPendingMessage = this.appMessagesManager.pendingTopMsgs[peerId];\n if(topPendingMessage) {\n if(!topMessage \n || (this.appMessagesManager.getMessageByPeer(peerId, topPendingMessage) as MyMessage).date > (this.appMessagesManager.getMessageByPeer(peerId, topMessage) as MyMessage).date) {\n dialog.top_message = topMessage = topPendingMessage;\n this.appMessagesManager.getHistoryStorage(peerId).maxId = topPendingMessage;\n }\n }\n\n /* const d = Object.assign({}, dialog);\n if(peerId === 239602833) {\n this.log.error('applyConversation lun', dialog, d);\n } */\n\n if(topMessage || (dialog.draft && dialog.draft._ === 'draftMessage')) {\n this.saveDialog(dialog);\n updatedDialogs[peerId] = dialog;\n } else {\n this.dropDialogWithEvent(peerId);\n }\n\n const updates = this.appMessagesManager.newUpdatesAfterReloadToHandle[peerId];\n if(updates !== undefined) {\n for(const update of updates) {\n updates.delete(update);\n this.apiUpdatesManager.saveUpdate(update);\n }\n\n if(!updates.size) {\n delete this.appMessagesManager.newUpdatesAfterReloadToHandle[peerId];\n }\n }\n });\n\n if(Object.keys(updatedDialogs).length) {\n rootScope.dispatchEvent('dialogs_multiupdate', updatedDialogs);\n }\n }\n\n public getDialogOffsetDate(dialog: Dialog) {\n return this.appMessagesManager.getMessageByPeer(dialog.peerId, dialog.top_message).date || 0;\n }\n\n /**\n * Won't save migrated from peer, forbidden peers, left and kicked\n */\n public saveDialog(dialog: Dialog, folderId = dialog.folder_id ?? 0, ignoreOffsetDate?: boolean, saveGlobalOffset?: boolean) {\n const peerId = this.appPeersManager.getPeerId(dialog.peer);\n if(!peerId) {\n console.error('saveConversation no peerId???', dialog, folderId);\n return;\n }\n\n if(dialog._ !== 'dialog'/* || peerId === 239602833 */) {\n console.error('saveConversation not regular dialog', dialog, Object.assign({}, dialog));\n }\n \n const channelId = this.appPeersManager.isChannel(peerId) ? peerId.toChatId() : NULL_PEER_ID;\n\n if(peerId.isAnyChat()) {\n const chat: Chat = this.appChatsManager.getChat(peerId.toChatId());\n // ! chatForbidden stays for chat where you're kicked\n if(chat._ === 'channelForbidden' /* || chat._ === 'chatForbidden' */ || (chat as Chat.chat).pFlags.left || (chat as Chat.chat).pFlags.kicked) {\n return;\n }\n }\n\n const peerText = this.appPeersManager.getPeerSearchText(peerId);\n this.dialogsIndex.indexObject(peerId, peerText);\n\n const wasDialogBefore = this.getDialogOnly(peerId);\n\n let mid: number, message: MyMessage;\n if(dialog.top_message) {\n mid = this.appMessagesIdsManager.generateMessageId(dialog.top_message);//dialog.top_message;\n\n // preserve outgoing message\n const wasTopMessage = wasDialogBefore?.top_message && this.appMessagesManager.getMessageByPeer(peerId, wasDialogBefore.top_message) as MyMessage;\n if(wasTopMessage?.pFlags?.is_outgoing && wasDialogBefore.top_message >= mid) {\n mid = wasDialogBefore.top_message;\n }\n\n message = this.appMessagesManager.getMessageByPeer(peerId, mid);\n } else {\n mid = this.appMessagesManager.generateTempMessageId(peerId);\n message = {\n _: 'message',\n id: mid,\n mid,\n from_id: this.appPeersManager.getOutputPeer(this.appUsersManager.getSelf().id.toPeerId(false)),\n peer_id: this.appPeersManager.getOutputPeer(peerId),\n deleted: true,\n pFlags: {out: true},\n date: 0,\n message: ''\n };\n this.appMessagesManager.saveMessages([message], {isOutgoing: true});\n }\n\n if(!message?.pFlags) {\n this.appMessagesManager.log.error('saveConversation no message:', dialog, message);\n }\n\n if(!channelId && peerId.isAnyChat()) {\n const chat = this.appChatsManager.getChat(peerId.toChatId());\n if(chat && chat.migrated_to && chat.pFlags.deactivated) {\n const migratedToPeer = this.appPeersManager.getPeerId(chat.migrated_to);\n this.appMessagesManager.migratedFromTo[peerId] = migratedToPeer;\n this.appMessagesManager.migratedToFrom[migratedToPeer] = peerId;\n dialog.migratedTo = migratedToPeer;\n //return;\n }\n }\n\n dialog.top_message = mid;\n // dialog.unread_count = wasDialogBefore && dialog.read_inbox_max_id === this.appMessagesIdsManager.getServerMessageId(wasDialogBefore.read_inbox_max_id) ? wasDialogBefore.unread_count : dialog.unread_count;\n dialog.read_inbox_max_id = this.appMessagesIdsManager.generateMessageId(wasDialogBefore && !dialog.read_inbox_max_id ? wasDialogBefore.read_inbox_max_id : dialog.read_inbox_max_id);\n dialog.read_outbox_max_id = this.appMessagesIdsManager.generateMessageId(wasDialogBefore && !dialog.read_outbox_max_id ? wasDialogBefore.read_outbox_max_id : dialog.read_outbox_max_id);\n\n if(dialog.folder_id === undefined) {\n if(dialog._ === 'dialog') {\n // ! СЛОЖНО ! СМОТРИ В getTopMessages\n dialog.folder_id = wasDialogBefore ? wasDialogBefore.folder_id : folderId;\n }/* else if(dialog._ === 'dialogFolder') {\n dialog.folder_id = dialog.folder.id;\n } */\n }\n\n dialog.draft = this.appDraftsManager.saveDraft(peerId, 0, dialog.draft);\n dialog.peerId = peerId;\n\n // Because we saved message without dialog present\n if(message.pFlags.is_outgoing) {\n const isOut = message.pFlags.out;\n if(mid > dialog[isOut ? 'read_outbox_max_id' : 'read_inbox_max_id']) {\n message.pFlags.unread = true;\n\n if(!dialog.unread_count && !isOut) {\n ++dialog.unread_count;\n }\n } else {\n delete message.pFlags.unread;\n }\n }\n\n const historyStorage = this.appMessagesManager.getHistoryStorage(peerId);\n const slice = historyStorage.history.slice;\n /* if(historyStorage === undefined) { // warning\n historyStorage.history.push(mid);\n } else */if(!slice.length) {\n historyStorage.history.unshift(mid);\n historyStorage.count ||= 1;\n if(this.appMessagesManager.mergeReplyKeyboard(historyStorage, message)) {\n rootScope.dispatchEvent('history_reply_markup', {peerId});\n }\n } else if(!slice.isEnd(SliceEnd.Bottom)) { // * this will probably never happen, however, if it does, then it will fix slice with top_message\n const slice = historyStorage.history.insertSlice([mid]);\n slice.setEnd(SliceEnd.Bottom);\n historyStorage.count ||= 1;\n if(this.appMessagesManager.mergeReplyKeyboard(historyStorage, message)) {\n rootScope.dispatchEvent('history_reply_markup', {peerId});\n }\n }\n\n historyStorage.maxId = mid;\n historyStorage.readMaxId = dialog.read_inbox_max_id;\n historyStorage.readOutboxMaxId = dialog.read_outbox_max_id;\n\n this.appNotificationsManager.savePeerSettings({\n peerId, \n settings: dialog.notify_settings\n });\n\n if(channelId && dialog.pts) {\n this.apiUpdatesManager.addChannelState(channelId, dialog.pts);\n }\n\n this.generateIndexForDialog(dialog);\n\n defineNotNumerableProperties(dialog, [\n 'index_0',\n 'index_1',\n 'index_2',\n 'index_3',\n 'index_4',\n 'index_5',\n 'index_6',\n 'index_7',\n 'index_8',\n 'index_9',\n 'index_10'\n ]);\n\n if(wasDialogBefore) {\n safeReplaceObject(wasDialogBefore, dialog);\n }\n\n this.pushDialog(dialog, message.date, ignoreOffsetDate, saveGlobalOffset);\n }\n\n public getDialogIndexKey(filterId: number) {\n const indexStr = filterId > 1 ? \n `index_${this.appMessagesManager.filtersStorage.getFilter(filterId).orderIndex}` as const : \n 'index' as const;\n\n return indexStr;\n }\n\n public getDialogs(query = '', offsetIndex?: number, limit = 20, folderId = 0, skipMigrated = false): {\n cached: boolean,\n promise: Promise<{\n dialogs: Dialog[],\n count: number,\n isTopEnd: boolean,\n isEnd: boolean\n }>\n } {\n const ret: {\n cached: boolean,\n promise: Promise<{\n dialogs: Dialog[],\n count: number,\n isTopEnd: boolean,\n isEnd: boolean\n }>\n } = {} as any;\n\n if(folderId > 1) {\n const promises: Promise<any>[] = [];\n\n const fillContactsResult = this.appUsersManager.fillContacts();\n if(!fillContactsResult.cached) {\n promises.push(fillContactsResult.promise);\n }\n\n const reloadMissingDialogsPromise = this.appMessagesManager.filtersStorage.reloadMissingPeerIds(folderId);\n if(reloadMissingDialogsPromise) {\n promises.push(reloadMissingDialogsPromise);\n }\n\n if(promises.length) {\n ret.cached = false;\n ret.promise = Promise.all(promises).then(() => {\n return this.getDialogs(query, offsetIndex, limit, folderId, skipMigrated).promise;\n });\n\n return ret;\n }\n }\n\n // let's load only first pages by certain folderId. next pages will load without folder filtering\n const realFolderId = folderId > 1 || this.getOffsetDate(folderId) ? GLOBAL_FOLDER_ID : folderId;\n let curDialogStorage = this.getFolderDialogs(folderId, skipMigrated);\n\n const indexStr = this.getDialogIndexKey(folderId);\n\n if(query) {\n if(!limit || this.cachedResults.query !== query || this.cachedResults.folderId !== folderId) {\n this.cachedResults.query = query;\n this.cachedResults.folderId = folderId;\n\n const results = this.dialogsIndex.search(query);\n\n const dialogs: Dialog[] = [];\n for(const peerId in this.dialogs) {\n const dialog = this.dialogs[peerId];\n if(results.has(dialog.peerId) && dialog.folder_id === folderId) {\n dialogs.push(dialog);\n }\n }\n\n dialogs.sort((d1, d2) => d2[indexStr] - d1[indexStr]);\n this.cachedResults.dialogs = dialogs;\n this.cachedResults.count = dialogs.length;\n }\n\n curDialogStorage = this.cachedResults.dialogs;\n } else {\n this.cachedResults.query = '';\n }\n\n let offset = 0;\n if(offsetIndex > 0) {\n for(let length = curDialogStorage.length; offset < length; ++offset) {\n if(offsetIndex > curDialogStorage[offset][indexStr]) {\n break;\n }\n }\n }\n\n const loadedAll = this.isDialogsLoaded(realFolderId);\n const isEnoughDialogs = curDialogStorage.length >= (offset + limit);\n if(query || loadedAll || isEnoughDialogs) {\n const dialogs = curDialogStorage.slice(offset, offset + limit);\n ret.cached = true;\n ret.promise = Promise.resolve({\n dialogs,\n count: loadedAll ? curDialogStorage.length : null,\n isTopEnd: curDialogStorage.length && ((dialogs[0] && dialogs[0] === curDialogStorage[0]) || curDialogStorage[0][indexStr] < offsetIndex),\n isEnd: (query || loadedAll) && (offset + limit) >= curDialogStorage.length\n });\n\n return ret;\n }\n\n ret.cached = false;\n ret.promise = this.appMessagesManager.getTopMessages(limit, realFolderId).then(result => {\n //const curDialogStorage = this[folderId];\n if(skipMigrated) {\n curDialogStorage = this.getFolderDialogs(folderId, skipMigrated);\n }\n\n offset = 0;\n if(offsetIndex > 0) {\n for(let length = curDialogStorage.length; offset < length; ++offset) {\n if(offsetIndex > curDialogStorage[offset][indexStr]) {\n break;\n }\n }\n }\n\n //this.log.warn(offset, offset + limit, curDialogStorage.dialogs.length, this.dialogs.length);\n\n const dialogs = curDialogStorage.slice(offset, offset + limit);\n return {\n dialogs,\n count: result.count === undefined ? curDialogStorage.length : result.count,\n isTopEnd: curDialogStorage.length && ((dialogs[0] && dialogs[0] === curDialogStorage[0]) || curDialogStorage[0][indexStr] < offsetIndex),\n // isEnd: this.isDialogsLoaded(realFolderId) && (offset + limit) >= curDialogStorage.length\n isEnd: result.isEnd\n };\n });\n\n return ret;\n }\n\n // only 0 and 1 folders\n private onUpdateFolderPeers = (update: Update.updateFolderPeers) => {\n //this.log('updateFolderPeers', update);\n const peers = update.folder_peers;\n\n peers.forEach((folderPeer) => {\n const {folder_id, peer} = folderPeer;\n\n const peerId = this.appPeersManager.getPeerId(peer);\n const dialog = this.dropDialog(peerId)[0];\n if(dialog) {\n if(dialog.pFlags?.pinned) {\n this.handleDialogUnpinning(dialog, folder_id);\n }\n\n dialog.folder_id = folder_id;\n this.generateIndexForDialog(dialog);\n this.pushDialog(dialog); // need for simultaneously updatePinnedDialogs\n }\n\n this.appMessagesManager.scheduleHandleNewDialogs(peerId, dialog);\n });\n };\n\n private onUpdateDialogPinned = (update: Update.updateDialogPinned) => {\n const folderId = update.folder_id ?? 0;\n //this.log('updateDialogPinned', update);\n const peerId = this.appPeersManager.getPeerId((update.peer as DialogPeer.dialogPeer).peer);\n const dialog = this.getDialogOnly(peerId);\n\n // этот код внизу никогда не сработает, в папках за пиннед отвечает updateDialogFilter\n /* if(update.folder_id > 1) {\n const filter = this.filtersStorage.filters[update.folder_id];\n if(update.pFlags.pinned) {\n filter.pinned_peers.unshift(peerId);\n } else {\n filter.pinned_peers.findAndSplice(p => p === peerId);\n }\n } */\n\n if(dialog) {\n if(!update.pFlags.pinned) {\n this.handleDialogUnpinning(dialog, folderId);\n } else { // means set\n dialog.pFlags.pinned = true;\n }\n\n this.generateIndexForDialog(dialog);\n } \n\n this.appMessagesManager.scheduleHandleNewDialogs(peerId, dialog);\n };\n\n private onUpdatePinnedDialogs = (update: Update.updatePinnedDialogs) => {\n const folderId = update.folder_id ?? 0;\n \n const handleOrder = (order: PeerId[]) => {\n this.pinnedOrders[folderId].length = 0;\n order.reverse(); // index must be higher\n order.forEach((peerId) => {\n newPinned[peerId] = true;\n \n const dialog = this.getDialogOnly(peerId);\n this.appMessagesManager.scheduleHandleNewDialogs(peerId, dialog);\n if(!dialog) {\n return;\n }\n \n dialog.pFlags.pinned = true;\n this.generateIndexForDialog(dialog);\n });\n \n const dialogs = this.getFolderDialogs(folderId, false);\n for(const dialog of dialogs) {\n if(!dialog.pFlags.pinned) {\n break;\n }\n\n const peerId = dialog.peerId;\n if(!newPinned[peerId]) {\n this.appMessagesManager.scheduleHandleNewDialogs(peerId);\n }\n }\n };\n\n //this.log('updatePinnedDialogs', update);\n const newPinned: {[peerId: PeerId]: true} = {};\n if(!update.order) {\n apiManager.invokeApi('messages.getPinnedDialogs', {\n folder_id: folderId\n }).then((dialogsResult) => {\n // * for test reordering and rendering\n // dialogsResult.dialogs.reverse();\n\n this.applyDialogs(dialogsResult);\n\n handleOrder(dialogsResult.dialogs.map(d => d.peerId));\n\n /* dialogsResult.dialogs.forEach((dialog) => {\n newPinned[dialog.peerId] = true;\n });\n\n this.dialogsStorage.getFolder(folderId).forEach((dialog) => {\n const peerId = dialog.peerId;\n if(dialog.pFlags.pinned && !newPinned[peerId]) {\n this.newDialogsToHandle[peerId] = {reload: true};\n this.scheduleHandleNewDialogs();\n }\n }); */\n });\n\n return;\n }\n\n //this.log('before order:', this.dialogsStorage[0].map(d => d.peerId));\n\n handleOrder(update.order.map(peer => this.appPeersManager.getPeerId((peer as DialogPeer.dialogPeer).peer)));\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { copy, safeReplaceObject } from \"../../helpers/object\";\nimport type { DialogFilter, Update } from \"../../layer\";\nimport type { Modify } from \"../../types\";\nimport type { AppPeersManager } from \"../appManagers/appPeersManager\";\nimport type { AppUsersManager } from \"../appManagers/appUsersManager\";\n//import type { ApiManagerProxy } from \"../mtproto/mtprotoworker\";\nimport type _rootScope from \"../rootScope\";\nimport type {AppMessagesManager, Dialog} from '../appManagers/appMessagesManager';\nimport type {AppNotificationsManager} from \"../appManagers/appNotificationsManager\";\nimport type { ApiUpdatesManager } from \"../appManagers/apiUpdatesManager\";\nimport apiManager from \"../mtproto/mtprotoworker\";\nimport { forEachReverse } from \"../../helpers/array\";\nimport { AppStateManager } from \"../appManagers/appStateManager\";\n\nexport type MyDialogFilter = Modify<DialogFilter, {\n /* pinned_peers: PeerId[],\n include_peers: PeerId[],\n exclude_peers: PeerId[], */\n pinnedPeerIds: PeerId[],\n includePeerIds: PeerId[],\n excludePeerIds: PeerId[]\n}>;\n\nconst convertment = [\n ['pinned_peers', 'pinnedPeerIds'], \n ['exclude_peers', 'excludePeerIds'], \n ['include_peers', 'includePeerIds']\n] as ['pinned_peers' | 'exclude_peers' | 'include_peers', 'pinnedPeerIds' | 'excludePeerIds' | 'includePeerIds'][];\n\n// ! because 0 index is 'All Chats'\nconst START_ORDER_INDEX = 1;\n\nexport default class FiltersStorage {\n public filters: {[filterId: string]: MyDialogFilter};\n private orderIndex: number;\n private reloadedPeerIds: Set<PeerId>;\n\n constructor(private appMessagesManager: AppMessagesManager,\n private appPeersManager: AppPeersManager, \n private appUsersManager: AppUsersManager, \n private appNotificationsManager: AppNotificationsManager, \n private appStateManager: AppStateManager,\n private apiUpdatesManager: ApiUpdatesManager, \n /* private apiManager: ApiManagerProxy, */ \n private rootScope: typeof _rootScope) {\n this.clear(true);\n this.filters = {};\n\n this.appStateManager.getState().then((state) => {\n safeReplaceObject(this.filters, state.filters);\n\n for(const filterId in this.filters) {\n const filter = this.filters[filterId];\n if(filter.hasOwnProperty('orderIndex') && filter.orderIndex >= this.orderIndex) {\n this.orderIndex = filter.orderIndex + 1;\n }\n\n /* this.appMessagesManager.dialogsStorage.folders[+filterId] = {\n dialogs: []\n }; */\n }\n });\n\n rootScope.addMultipleEventsListeners({\n updateDialogFilter: this.onUpdateDialogFilter,\n\n updateDialogFilters: (update) => {\n //console.warn('updateDialogFilters', update);\n\n const oldFilters = copy(this.filters);\n\n this.getDialogFilters(true).then(filters => {\n for(const _filterId in oldFilters) {\n const filterId = +_filterId;\n if(!filters.find(filter => filter.id === filterId)) { // * deleted\n this.onUpdateDialogFilter({_: 'updateDialogFilter', id: filterId});\n }\n }\n\n this.onUpdateDialogFilterOrder({_: 'updateDialogFilterOrder', order: filters.map(filter => filter.id)});\n });\n },\n\n updateDialogFilterOrder: this.onUpdateDialogFilterOrder\n });\n\n // delete peers when dialog is being dropped\n /* rootScope.addEventListener('peer_deleted', (peerId) => {\n for(const filterId in this.filters) {\n const filter = this.filters[filterId];\n let modified = false;\n [filter.pinned_peers, filter.include_peers, filter.exclude_peers].forEach(arr => {\n forEachReverse(arr, (inputPeer, idx) => {\n if(this.appPeersManager.getPeerId(inputPeer) === peerId) {\n arr.splice(idx, 1);\n modified = true;\n }\n });\n });\n\n if(modified) {\n this.saveDialogFilter(filter, true);\n }\n }\n }); */\n }\n\n public clear(init = false) {\n if(!init) {\n safeReplaceObject(this.filters, {});\n this.reloadedPeerIds.clear();\n } else {\n this.filters = {};\n this.reloadedPeerIds = new Set();\n }\n\n this.orderIndex = START_ORDER_INDEX;\n }\n\n private onUpdateDialogFilter = (update: Update.updateDialogFilter) => {\n if(update.filter) {\n this.saveDialogFilter(update.filter as any);\n } else if(this.filters[update.id]) { // Папка удалена\n //this.getDialogFilters(true);\n this.rootScope.dispatchEvent('filter_delete', this.filters[update.id]);\n delete this.filters[update.id];\n }\n\n this.appStateManager.pushToState('filters', this.filters);\n };\n\n private onUpdateDialogFilterOrder = (update: Update.updateDialogFilterOrder) => {\n //console.log('updateDialogFilterOrder', update);\n\n this.orderIndex = START_ORDER_INDEX;\n update.order.forEach((filterId, idx) => {\n const filter = this.filters[filterId];\n delete filter.orderIndex;\n this.setOrderIndex(filter);\n });\n\n this.rootScope.dispatchEvent('filter_order', update.order);\n\n this.appStateManager.pushToState('filters', this.filters);\n };\n\n public testDialogForFilter(dialog: Dialog, filter: MyDialogFilter) {\n const peerId = dialog.peerId;\n\n // * check whether dialog exists\n if(!this.appMessagesManager.getDialogOnly(peerId)) {\n return false;\n }\n\n // exclude_peers\n if(filter.excludePeerIds.includes(peerId)) {\n return false;\n }\n\n // include_peers\n if(filter.includePeerIds.includes(peerId)) {\n return true;\n }\n\n const pFlags = filter.pFlags;\n\n // exclude_archived\n if(pFlags.exclude_archived && dialog.folder_id === 1) {\n return false;\n }\n\n // exclude_read\n if(pFlags.exclude_read && !this.appMessagesManager.isDialogUnread(dialog)) {\n return false;\n }\n\n // exclude_muted\n if(pFlags.exclude_muted && this.appNotificationsManager.isPeerLocalMuted(peerId) && !(dialog.unread_mentions_count && dialog.unread_count)) {\n return false;\n }\n\n if(this.appPeersManager.isAnyChat(peerId)) {\n // broadcasts\n if(pFlags.broadcasts && this.appPeersManager.isBroadcast(peerId)) {\n return true;\n }\n\n // groups\n if(pFlags.groups && this.appPeersManager.isAnyGroup(peerId)) {\n return true;\n }\n } else {\n const userId = peerId.toUserId();\n \n // bots\n if(this.appUsersManager.isBot(userId)) {\n return !!pFlags.bots;\n }\n \n // non_contacts\n if(pFlags.non_contacts && !this.appUsersManager.isContact(userId)) {\n return true;\n }\n\n // contacts\n if(pFlags.contacts && this.appUsersManager.isContact(userId)) {\n return true;\n }\n }\n\n return false;\n }\n\n public testDialogForFilterId(dialog: Dialog, filterId: number) {\n return this.testDialogForFilter(dialog, this.filters[filterId]);\n }\n\n public getFilter(filterId: number) {\n return this.filters[filterId];\n }\n\n public toggleDialogPin(peerId: PeerId, filterId: number) {\n const filter = this.filters[filterId];\n\n const index = filter.pinnedPeerIds.indexOf(peerId);\n const wasPinned = index !== -1;\n\n if(wasPinned) {\n filter.pinned_peers.splice(index, 1);\n filter.pinnedPeerIds.splice(index, 1);\n }\n \n if(!wasPinned) {\n if(filter.pinned_peers.length >= this.rootScope.config.pinned_infolder_count_max) {\n return Promise.reject({type: 'PINNED_DIALOGS_TOO_MUCH'});\n }\n \n filter.pinned_peers.unshift(this.appPeersManager.getInputPeerById(peerId));\n filter.pinnedPeerIds.unshift(peerId);\n }\n \n return this.updateDialogFilter(filter);\n }\n\n public createDialogFilter(filter: MyDialogFilter, prepend?: boolean) {\n const maxId = Math.max(1, ...Object.keys(this.filters).map(i => +i));\n filter = copy(filter);\n filter.id = maxId + 1;\n return this.updateDialogFilter(filter, undefined, prepend);\n }\n\n public updateDialogFilter(filter: MyDialogFilter, remove = false, prepend = false) {\n const flags = remove ? 0 : 1;\n\n return apiManager.invokeApi('messages.updateDialogFilter', {\n flags,\n id: filter.id,\n filter: remove ? undefined : this.getOutputDialogFilter(filter)\n }).then((bool: boolean) => { // возможно нужна проверка и откат, если результат не ТРУ\n //console.log('updateDialogFilter bool:', bool);\n\n if(bool) {\n /* if(!this.filters[filter.id]) {\n this.saveDialogFilter(filter);\n }\n\n rootScope.$broadcast('filter_update', filter); */\n\n this.onUpdateDialogFilter({\n _: 'updateDialogFilter',\n id: filter.id,\n filter: remove ? undefined : filter as any\n });\n\n if(prepend) {\n const f: MyDialogFilter[] = [];\n for(const filterId in this.filters) {\n const filter = this.filters[filterId];\n ++filter.orderIndex;\n f.push(filter);\n }\n\n filter.orderIndex = START_ORDER_INDEX;\n\n const order = f.sort((a, b) => a.orderIndex - b.orderIndex).map(filter => filter.id);\n this.onUpdateDialogFilterOrder({\n _: 'updateDialogFilterOrder',\n order\n });\n }\n }\n\n return bool;\n });\n }\n\n public getOutputDialogFilter(filter: MyDialogFilter) {\n const c = copy(filter);\n /* convertment.forEach(([from, to]) => {\n c[from] = c[to].map((peerId) => this.appPeersManager.getInputPeerById(peerId));\n }); */\n\n this.filterIncludedPinnedPeers(filter);\n\n return c;\n }\n\n private filterIncludedPinnedPeers(filter: MyDialogFilter) {\n forEachReverse(filter.includePeerIds, (peerId, idx) => {\n if(filter.pinnedPeerIds.includes(peerId)) {\n filter.include_peers.splice(idx, 1);\n filter.includePeerIds.splice(idx, 1);\n }\n });\n }\n\n public reloadMissingPeerIds(filterId: number, type: 'pinned_peers' | 'include_peers' | 'exclude_peers' = 'pinned_peers') {\n const promises: Promise<any>[] = [];\n const filter = this.getFilter(filterId);\n const peers = filter && filter[type];\n if(peers?.length) {\n const reloadDialogs = peers.filter((inputPeer, idx) => {\n const peerId = this.appPeersManager.getPeerId(inputPeer);\n return !this.reloadedPeerIds.has(peerId) && !this.appMessagesManager.getDialogOnly(peerId);\n });\n\n if(reloadDialogs.length) {\n const reloadPromises = reloadDialogs.map(inputPeer => {\n const peerId = this.appPeersManager.getPeerId(inputPeer);\n const promise = this.appMessagesManager.reloadConversation(inputPeer);\n promise.then(() => {\n this.reloadedPeerIds.add(peerId);\n });\n return promise;\n });\n const reloadPromise = Promise.all(reloadPromises);\n promises.push(reloadPromise);\n }\n }\n\n return promises.length ? Promise.all(promises) : undefined;\n }\n\n public async getDialogFilters(overwrite = false): Promise<MyDialogFilter[]> {\n const keys = Object.keys(this.filters);\n if(keys.length && !overwrite) {\n return keys.map(filterId => this.filters[filterId]).sort((a, b) => a.orderIndex - b.orderIndex);\n }\n\n const filters: MyDialogFilter[] = await apiManager.invokeApiSingle('messages.getDialogFilters') as any;\n for(const filter of filters) {\n this.saveDialogFilter(filter, overwrite);\n }\n\n //console.log(this.filters);\n return filters;\n }\n\n public saveDialogFilter(filter: MyDialogFilter, update = true) {\n // defineNotNumerableProperties(filter, ['includePeerIds', 'excludePeerIds', 'pinnedPeerIds']);\n\n convertment.forEach(([from, to]) => {\n filter[to] = filter[from].map((peer) => this.appPeersManager.getPeerId(peer));\n });\n\n this.filterIncludedPinnedPeers(filter);\n \n filter.include_peers = filter.pinned_peers.concat(filter.include_peers);\n filter.includePeerIds = filter.pinnedPeerIds.concat(filter.includePeerIds);\n\n const oldFilter = this.filters[filter.id];\n if(oldFilter) {\n Object.assign(oldFilter, filter);\n } else {\n this.filters[filter.id] = filter;\n }\n \n this.setOrderIndex(filter);\n \n if(update) {\n this.rootScope.dispatchEvent('filter_update', filter);\n } else if(!oldFilter) {\n this.rootScope.dispatchEvent('filter_new', filter);\n }\n }\n\n public setOrderIndex(filter: MyDialogFilter) {\n if(filter.hasOwnProperty('orderIndex')) {\n if(filter.orderIndex >= this.orderIndex) {\n this.orderIndex = filter.orderIndex + 1;\n }\n } else {\n filter.orderIndex = this.orderIndex++ as DialogFilter['orderIndex'];\n }\n\n this.appStateManager.pushToState('filters', this.filters);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov <igor.beatle@gmail.com>\n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport { LazyLoadQueueBase } from \"../../components/lazyLoadQueue\";\nimport ProgressivePreloader from \"../../components/preloader\";\nimport { CancellablePromise, deferredPromise } from \"../../helpers/cancellablePromise\";\nimport { formatDateAccordingToTodayNew, formatTime, tsNow } from \"../../helpers/date\";\nimport { createPosterForVideo } from \"../../helpers/files\";\nimport { copy, getObjectKeysAndSort } from \"../../helpers/object\";\nimport { randomLong } from \"../../helpers/random\";\nimport { splitStringByLength, limitSymbols, escapeRegExp } from \"../../helpers/string\";\nimport { Chat, ChatFull, Dialog as MTDialog, DialogPeer, DocumentAttribute, InputMedia, InputMessage, InputPeerNotifySettings, InputSingleMedia, Message, MessageAction, MessageEntity, MessageFwdHeader, MessageMedia, MessageReplies, MessageReplyHeader, MessagesDialogs, MessagesFilter, MessagesMessages, MethodDeclMap, NotifyPeer, PeerNotifySettings, PhotoSize, SendMessageAction, Update, Photo, Updates, ReplyMarkup, InputPeer, InputPhoto, InputDocument, InputGeoPoint, WebPage, GeoPoint, ReportReason, MessagesGetDialogs, InputChannel, InputDialogPeer } from \"../../layer\";\nimport { InvokeApiOptions } from \"../../types\";\nimport I18n, { FormatterArguments, i18n, join, langPack, LangPackKey, UNSUPPORTED_LANG_PACK_KEY, _i18n } from \"../langPack\";\nimport { logger, LogTypes } from \"../logger\";\nimport type { ApiFileManager } from '../mtproto/apiFileManager';\n//import apiManager from '../mtproto/apiManager';\nimport apiManager from '../mtproto/mtprotoworker';\nimport referenceDatabase, { ReferenceContext } from \"../mtproto/referenceDatabase\";\nimport serverTimeManager from \"../mtproto/serverTimeManager\";\nimport { RichTextProcessor } from \"../richtextprocessor\";\nimport rootScope from \"../rootScope\";\nimport DialogsStorage, { GLOBAL_FOLDER_ID } from \"../storages/dialogs\";\nimport FiltersStorage from \"../storages/filters\";\n//import { telegramMeWebService } from \"../mtproto/mtproto\";\nimport apiUpdatesManager from \"./apiUpdatesManager\";\nimport appChatsManager, { ChatRights } from \"./appChatsManager\";\nimport appDocsManager, { MyDocument } from \"./appDocsManager\";\nimport appDownloadManager from \"./appDownloadManager\";\nimport appPeersManager from \"./appPeersManager\";\nimport appPhotosManager, { MyPhoto } from \"./appPhotosManager\";\nimport appPollsManager from \"./appPollsManager\";\nimport appStateManager from \"./appStateManager\";\nimport appUsersManager from \"./appUsersManager\";\nimport appWebPagesManager from \"./appWebPagesManager\";\nimport appDraftsManager, { MyDraftMessage } from \"./appDraftsManager\";\nimport { getFileNameByLocation } from \"../../helpers/fileName\";\nimport appProfileManager from \"./appProfileManager\";\nimport DEBUG, { MOUNT_CLASS_TO } from \"../../config/debug\";\nimport SlicedArray, { Slice, SliceEnd } from \"../../helpers/slicedArray\";\nimport appNotificationsManager, { NotifyOptions } from \"./appNotificationsManager\";\nimport PeerTitle from \"../../components/peerTitle\";\nimport { forEachReverse, indexOfAndSplice } from \"../../helpers/array\";\nimport htmlToDocumentFragment from \"../../helpers/dom/htmlToDocumentFragment\";\nimport htmlToSpan from \"../../helpers/dom/htmlToSpan\";\nimport { MUTE_UNTIL, NULL_PEER_ID, REPLIES_PEER_ID, SERVICE_PEER_ID } from \"../mtproto/mtproto_config\";\nimport formatCallDuration from \"../../helpers/formatCallDuration\";\nimport appAvatarsManager from \"./appAvatarsManager\";\nimport telegramMeWebManager from \"../mtproto/telegramMeWebManager\";\nimport { getMiddleware } from \"../../helpers/middleware\";\nimport assumeType from \"../../helpers/assumeType\";\nimport appMessagesIdsManager from \"./appMessagesIdsManager\";\nimport type { MediaSize } from \"../../helpers/mediaSizes\";\nimport IMAGE_MIME_TYPES_SUPPORTED from \"../../environment/imageMimeTypesSupport\";\nimport VIDEO_MIME_TYPES_SUPPORTED from \"../../environment/videoMimeTypesSupport\";\nimport './appGroupCallsManager';\nimport appGroupCallsManager from \"./appGroupCallsManager\";\n\n//console.trace('include');\n// TODO: если удалить диалог находясь в папке, то он не удалится из папки и будет виден в настройках\n\nconst APITIMEOUT = 0;\nconst DO_NOT_READ_HISTORY = false;\n\nexport type HistoryStorage = {\n count: number | null,\n history: SlicedArray,\n\n maxId?: number,\n readPromise?: Promise<void>,\n readMaxId?: number,\n readOutboxMaxId?: number,\n triedToReadMaxId?: number,\n\n maxOutId?: number,\n replyMarkup?: Exclude<ReplyMarkup, ReplyMarkup.replyInlineMarkup>\n};\n\nexport type HistoryResult = {\n count: number,\n history: Slice,\n offsetIdOffset?: number,\n};\n\nexport type Dialog = MTDialog.dialog;\n\nexport type MyMessage = Message.message | Message.messageService;\nexport type MyInputMessagesFilter = 'inputMessagesFilterEmpty' \n | 'inputMessagesFilterPhotos' \n | 'inputMessagesFilterPhotoVideo' \n | 'inputMessagesFilterVideo' \n | 'inputMessagesFilterDocument' \n | 'inputMessagesFilterVoice' \n | 'inputMessagesFilterRoundVoice' \n | 'inputMessagesFilterRoundVideo' \n | 'inputMessagesFilterMusic' \n | 'inputMessagesFilterUrl' \n | 'inputMessagesFilterMyMentions'\n | 'inputMessagesFilterChatPhotos'\n | 'inputMessagesFilterPinned';\n\nexport type PinnedStorage = Partial<{\n promise: Promise<PinnedStorage>,\n count: number,\n maxId: number\n}>;\nexport type MessagesStorage = Map<number, any>;\n\nexport type MyMessageActionType = Message.messageService['action']['_'];\n\ntype PendingAfterMsg = Partial<InvokeApiOptions & {\n afterMessageId: string,\n messageId: string\n}>;\n\nexport class AppMessagesManager {\n private messagesStorageByPeerId: {[peerId: string]: MessagesStorage};\n public groupedMessagesStorage: {[groupId: string]: MessagesStorage}; // will be used for albums\n private scheduledMessagesStorage: {[peerId: PeerId]: MessagesStorage};\n private historiesStorage: {\n [peerId: PeerId]: HistoryStorage\n };\n private threadsStorage: {\n [peerId: PeerId]: {\n [threadId: string]: HistoryStorage\n }\n };\n private searchesStorage: {\n [peerId: PeerId]: Partial<{\n [inputFilter in MyInputMessagesFilter]: {\n count?: number,\n history: number[]\n }\n }>\n };\n public pinnedMessages: {[peerId: PeerId]: PinnedStorage};\n\n public threadsServiceMessagesIdsStorage: {[peerId_threadId: string]: number};\n private threadsToReplies: {\n [peerId_threadId: string]: string;\n };\n\n private pendingByRandomId: {\n [randomId: string]: {\n peerId: PeerId,\n tempId: number,\n threadId: number,\n storage: MessagesStorage\n }\n } = {};\n private pendingByMessageId: {[mid: string]: Long} = {};\n private pendingAfterMsgs: {[peerId: PeerId]: PendingAfterMsg} = {};\n public pendingTopMsgs: {[peerId: PeerId]: number} = {};\n private tempFinalizeCallbacks: {\n [tempId: string]: {\n [callbackName: string]: Partial<{\n deferred: CancellablePromise<void>, \n callback: (message: any) => Promise<any>\n }>\n }\n } = {};\n \n private sendSmthLazyLoadQueue = new LazyLoadQueueBase(10);\n\n private needSingleMessages: Map<PeerId, Map<number, CancellablePromise<Message>>> = new Map();\n private fetchSingleMessagesPromise: Promise<void> = null;\n\n private maxSeenId = 0;\n\n public migratedFromTo: {[peerId: PeerId]: PeerId} = {};\n public migratedToFrom: {[peerId: PeerId]: PeerId} = {};\n\n private newMessagesHandleTimeout = 0;\n private newMessagesToHandle: {[peerId: PeerId]: Set<number>} = {};\n private newDialogsHandlePromise: Promise<any>;\n private newDialogsToHandle: {[peerId: PeerId]: Dialog} = {};\n public newUpdatesAfterReloadToHandle: {[peerId: PeerId]: Set<Update>} = {};\n\n private notificationsHandlePromise = 0;\n private notificationsToHandle: {[peerId: PeerId]: {\n fwdCount: number,\n fromId: PeerId,\n topMessage?: MyMessage\n }} = {};\n\n private reloadConversationsPromise: Promise<void>;\n private reloadConversationsPeers: Map<PeerId, {inputDialogPeer: InputDialogPeer, promise: CancellablePromise<Dialog>}> = new Map();\n\n public log = logger('MESSAGES', LogTypes.Error | LogTypes.Debug | LogTypes.Log | LogTypes.Warn);\n\n public dialogsStorage: DialogsStorage;\n public filtersStorage: FiltersStorage;\n\n private groupedTempId = 0;\n\n private typings: {[peerId: PeerId]: {action: SendMessageAction, timeout?: number}} = {};\n\n private middleware: ReturnType<typeof getMiddleware>;\n\n private unreadMentions: {[peerId: PeerId]: SlicedArray} = {};\n private goToNextMentionPromises: {[peerId: PeerId]: Promise<any>} = {};\n\n constructor() {\n this.clear();\n\n rootScope.addMultipleEventsListeners({\n updateMessageID: this.onUpdateMessageId,\n\n updateNewDiscussionMessage: this.onUpdateNewMessage,\n updateNewMessage: this.onUpdateNewMessage,\n updateNewChannelMessage: this.onUpdateNewMessage,\n\n updateDialogUnreadMark: this.onUpdateDialogUnreadMark,\n\n updateEditMessage: this.onUpdateEditMessage,\n updateEditChannelMessage: this.onUpdateEditMessage,\n\n updateReadChannelDiscussionInbox: this.onUpdateReadHistory,\n updateReadChannelDiscussionOutbox: this.onUpdateReadHistory,\n updateReadHistoryInbox: this.onUpdateReadHistory,\n updateReadHistoryOutbox: this.onUpdateReadHistory,\n updateReadChannelInbox: this.onUpdateReadHistory,\n updateReadChannelOutbox: this.onUpdateReadHistory,\n\n updateChannelReadMessagesContents: this.onUpdateReadMessagesContents,\n updateReadMessagesContents: this.onUpdateReadMessagesContents,\n\n updateChannelAvailableMessages: this.onUpdateChannelAvailableMessages,\n\n updateDeleteMessages: this.onUpdateDeleteMessages,\n updateDeleteChannelMessages: this.onUpdateDeleteMessages,\n\n updateChannel: this.onUpdateChannel,\n\n updateChannelReload: this.onUpdateChannelReload,\n\n updateChannelMessageViews: this.onUpdateChannelMessageViews,\n\n updateServiceNotification: this.onUpdateServiceNotification,\n\n updatePinnedMessages: this.onUpdatePinnedMessages,\n updatePinnedChannelMessages: this.onUpdatePinnedMessages,\n\n updateNotifySettings: this.onUpdateNotifySettings,\n\n updateNewScheduledMessage: this.onUpdateNewScheduledMessage,\n\n updateDeleteScheduledMessages: this.onUpdateDeleteScheduledMessages\n });\n\n // ! Invalidate notify settings, can optimize though\n rootScope.addEventListener('notify_peer_type_settings', ({key, settings}) => {\n const dialogs = this.dialogsStorage.getFolderDialogs(0).concat(this.dialogsStorage.getFolderDialogs(1));\n let filterFunc: (dialog: Dialog) => boolean;\n if(key === 'notifyUsers') filterFunc = (dialog) => dialog.peerId.isUser();\n else if(key === 'notifyBroadcasts') filterFunc = (dialog) => dialog.peerId.isBroadcast();\n else filterFunc = (dialog) => appPeersManager.isAnyGroup(dialog.peerId);\n\n dialogs\n .filter(filterFunc)\n .forEach(dialog => {\n rootScope.dispatchEvent('dialog_notify_settings', dialog);\n });\n });\n\n rootScope.addEventListener('webpage_updated', ({id, msgs}) => {\n msgs.forEach(({peerId, mid, isScheduled}) => {\n const storage = isScheduled ? this.getScheduledMessagesStorage(peerId) : this.getMessagesStorage(peerId);\n const message = this.getMessageFromStorage(storage, mid) as Message.message;\n if(!message) return;\n message.media = {\n _: 'messageMediaWebPage', \n webpage: appWebPagesManager.getWebPage(id)\n };\n\n rootScope.dispatchEvent('message_edit', {\n storage,\n peerId,\n mid\n });\n });\n });\n\n rootScope.addEventListener('draft_updated', ({peerId, threadId, draft}) => {\n if(threadId) return;\n\n const dialog = this.getDialogOnly(peerId);\n if(dialog) {\n if(!threadId) {\n dialog.draft = draft;\n\n let drop = false;\n if(!draft && !appMessagesIdsManager.getServerMessageId(dialog.top_message)) {\n this.dialogsStorage.dropDialog(peerId);\n drop = true;\n } else {\n this.dialogsStorage.generateIndexForDialog(dialog);\n this.dialogsStorage.pushDialog(dialog);\n }\n\n rootScope.dispatchEvent('dialog_draft', {\n peerId,\n dialog,\n drop,\n draft,\n index: dialog.index\n });\n }\n } else {\n this.reloadConversation(peerId);\n }\n });\n\n rootScope.addEventListener('poll_update', ({poll}) => {\n const set = appPollsManager.pollToMessages[poll.id];\n if(set) {\n for(const key of set) {\n const [peerId, mid] = key.split('_');\n\n const message = this.getMessageByPeer(peerId.toPeerId(), +mid);\n this.setDialogToStateIfMessageIsTop(message);\n }\n }\n });\n \n appStateManager.getState().then(state => {\n if(state.maxSeenMsgId) {\n this.maxSeenId = state.maxSeenMsgId;\n }\n });\n }\n\n public clear() {\n if(this.middleware) {\n this.middleware.clean();\n } else {\n this.middleware = getMiddleware();\n }\n\n this.messagesStorageByPeerId = {};\n this.groupedMessagesStorage = {};\n this.scheduledMessagesStorage = {};\n this.historiesStorage = {};\n this.threadsStorage = {};\n this.searchesStorage = {};\n this.pinnedMessages = {};\n this.threadsServiceMessagesIdsStorage = {};\n this.threadsToReplies = {};\n\n this.dialogsStorage && this.dialogsStorage.clear();\n this.filtersStorage && this.filtersStorage.clear();\n }\n\n public construct() {\n this.filtersStorage = new FiltersStorage(this, appPeersManager, appUsersManager, appNotificationsManager, appStateManager, apiUpdatesManager, /* apiManager, */ rootScope);\n this.dialogsStorage = new DialogsStorage(this, appChatsManager, appPeersManager, appUsersManager, appDraftsManager, appNotificationsManager, appStateManager, apiUpdatesManager, serverTimeManager, appMessagesIdsManager);\n }\n\n public getInputEntities(entities: MessageEntity[]) {\n const sendEntites = copy(entities);\n sendEntites.forEach((entity) => {\n if(entity._ === 'messageEntityMentionName') {\n (entity as any as MessageEntity.inputMessageEntityMentionName)._ = 'inputMessageEntityMentionName';\n (entity as any as MessageEntity.inputMessageEntityMentionName).user_id = appUsersManager.getUserInput(entity.user_id);\n }\n });\n return sendEntites;\n }\n\n public invokeAfterMessageIsSent(tempId: number, callbackName: string, callback: (message: any) => Promise<any>) {\n const finalize = this.tempFinalizeCallbacks[tempId] ?? (this.tempFinalizeCallbacks[tempId] = {});\n const obj = finalize[callbackName] ?? (finalize[callbackName] = {deferred: deferredPromise<void>()});\n\n obj.callback = callback;\n\n return obj.deferred;\n }\n\n public editMessage(message: any, text: string, options: Partial<{\n noWebPage: true,\n newMedia: any,\n scheduleDate: number,\n entities: MessageEntity[]\n }> = {}): Promise<void> {\n /* if(!this.canEditMessage(messageId)) {\n return Promise.reject({type: 'MESSAGE_EDIT_FORBIDDEN'});\n } */\n\n const {mid, peerId} = message;\n\n if(message.pFlags.is_outgoing) {\n return this.invokeAfterMessageIsSent(mid, 'edit', (message) => {\n //this.log('invoke editMessage callback', message);\n return this.editMessage(message, text, options);\n });\n }\n\n let entities = options.entities || [];\n if(text) {\n text = RichTextProcessor.parseMarkdown(text, entities);\n }\n\n const schedule_date = options.scheduleDate || (message.pFlags.is_scheduled ? message.date : undefined);\n return apiManager.invokeApi('messages.editMessage', {\n peer: appPeersManager.getInputPeerById(peerId),\n id: message.id,\n message: text,\n media: options.newMedia,\n entities: entities.length ? this.getInputEntities(entities) : undefined,\n no_webpage: options.noWebPage,\n schedule_date\n }).then((updates) => {\n apiUpdatesManager.processUpdateMessage(updates);\n }, (error) => {\n this.log.error('editMessage error:', error);\n \n if(error && error.type === 'MESSAGE_NOT_MODIFIED') {\n error.handled = true;\n return;\n }\n if(error && error.type === 'MESSAGE_EMPTY') {\n error.handled = true;\n }\n return Promise.reject(error);\n });\n }\n\n public sendText(peerId: PeerId, text: string, options: Partial<{\n entities: MessageEntity[],\n replyToMsgId: number,\n threadId: number,\n viaBotId: BotId,\n queryId: string,\n resultId: string,\n noWebPage: true,\n replyMarkup: ReplyMarkup,\n clearDraft: true,\n webPage: WebPage,\n scheduleDate: number,\n silent: true\n }> = {}) {\n if(!text.trim()) {\n return Promise.resolve();\n }\n\n //this.checkSendOptions(options);\n\n if(options.threadId && !options.replyToMsgId) {\n options.replyToMsgId = options.threadId;\n }\n\n const MAX_LENGTH = rootScope.config.message_length_max;\n if(text.length > MAX_LENGTH) {\n const splitted = splitStringByLength(text, MAX_LENGTH);\n text = splitted[0];\n\n if(splitted.length > 1) {\n delete options.webPage;\n }\n\n for(let i = 1; i < splitted.length; ++i) {\n setTimeout(() => {\n this.sendText(peerId, splitted[i], options);\n }, i);\n }\n }\n\n peerId = appPeersManager.getPeerMigratedTo(peerId) || peerId;\n\n let entities = options.entities || [];\n if(!options.viaBotId) {\n text = RichTextProcessor.parseMarkdown(text, entities);\n //entities = RichTextProcessor.mergeEntities(entities, RichTextProcessor.parseEntities(text));\n }\n\n let sendEntites = this.getInputEntities(entities);\n if(!sendEntites.length) {\n sendEntites = undefined;\n }\n\n const message = this.generateOutgoingMessage(peerId, options);\n message.entities = entities;\n message.message = text;\n\n const replyToMsgId = options.replyToMsgId ? appMessagesIdsManager.getServerMessageId(options.replyToMsgId) : undefined;\n const isChannel = appPeersManager.isChannel(peerId);\n\n if(options.webPage) {\n message.media = {\n _: 'messageMediaWebPage',\n webpage: options.webPage\n };\n }\n\n const toggleError = (on: boolean) => {\n if(on) {\n message.error = true;\n } else {\n delete message.error;\n }\n rootScope.dispatchEvent('messages_pending');\n };\n\n message.send = () => {\n toggleError(false);\n const sentRequestOptions: PendingAfterMsg = {};\n if(this.pendingAfterMsgs[peerId]) {\n sentRequestOptions.afterMessageId = this.pendingAfterMsgs[peerId].messageId;\n }\n\n let apiPromise: any;\n if(options.viaBotId) {\n apiPromise = apiManager.invokeApiAfter('messages.sendInlineBotResult', {\n peer: appPeersManager.getInputPeerById(peerId),\n random_id: message.random_id,\n reply_to_msg_id: replyToMsgId || undefined,\n query_id: options.queryId,\n id: options.resultId,\n clear_draft: options.clearDraft\n }, sentRequestOptions);\n } else {\n apiPromise = apiManager.invokeApiAfter('messages.sendMessage', {\n no_webpage: options.noWebPage,\n peer: appPeersManager.getInputPeerById(peerId),\n message: text,\n random_id: message.random_id,\n reply_to_msg_id: replyToMsgId || undefined,\n entities: sendEntites,\n clear_draft: options.clearDraft,\n schedule_date: options.scheduleDate || undefined,\n silent: options.silent\n }, sentRequestOptions);\n }\n\n /* function is<T>(value: any, condition: boolean): value is T {\n return condition;\n } */\n\n //this.log('sendText', message.mid);\n this.pendingAfterMsgs[peerId] = sentRequestOptions;\n\n return apiPromise.then((updates: Updates) => {\n //this.log('sendText sent', message.mid);\n //if(is<Updates.updateShortSentMessage>(updates, updates._ === 'updateShortSentMessage')) {\n if(updates._ === 'updateShortSentMessage') {\n //assumeType<Updates.updateShortSentMessage>(updates);\n\n // * fix copying object with promise\n const promise = message.promise;\n delete message.promise;\n const newMessage = copy(message);\n message.promise = promise;\n\n newMessage.date = updates.date;\n newMessage.id = updates.id;\n newMessage.media = updates.media;\n newMessage.entities = updates.entities;\n this.wrapMessageEntities(newMessage);\n if(updates.pFlags.out) {\n newMessage.pFlags.out = true;\n }\n\n // * override with new updates\n updates = {\n _: 'updates',\n users: [],\n chats: [],\n seq: 0,\n date: undefined,\n updates: [{\n _: 'updateMessageID',\n random_id: message.random_id,\n id: newMessage.id\n }, {\n _: options.scheduleDate ? 'updateNewScheduledMessage' : (isChannel ? 'updateNewChannelMessage' : 'updateNewMessage'),\n message: newMessage,\n pts: updates.pts,\n pts_count: updates.pts_count\n }]\n };\n } else if((updates as Updates.updates).updates) {\n (updates as Updates.updates).updates.forEach((update) => {\n if(update._ === 'updateDraftMessage') {\n update.local = true;\n }\n });\n }\n // Testing bad situations\n // var upd = angular.copy(updates)\n // updates.updates.splice(0, 1)\n\n apiUpdatesManager.processUpdateMessage(updates);\n\n // $timeout(function () {\n // ApiUpdatesManager.processUpdateMessage(upd)\n // }, 5000)\n message.promise.resolve();\n }, (error: any) => {\n toggleError(true);\n message.promise.reject(error);\n }).finally(() => {\n if(this.pendingAfterMsgs[peerId] === sentRequestOptions) {\n delete this.pendingAfterMsgs[peerId];\n }\n });\n };\n\n this.beforeMessageSending(message, {\n isScheduled: !!options.scheduleDate || undefined, \n threadId: options.threadId,\n clearDraft: options.clearDraft\n });\n\n return message.promise;\n }\n\n public sendFile(peerId: PeerId, file: File | Blob | MyDocument, options: Partial<{\n isRoundMessage: true,\n isVoiceMessage: true,\n isGroupedItem: true,\n isMedia: true,\n\n replyToMsgId: number,\n threadId: number,\n groupId: string,\n caption: string,\n entities: MessageEntity[],\n width: number,\n height: number,\n objectURL: string,\n thumb: {\n blob: Blob,\n url: string,\n size: MediaSize\n },\n duration: number,\n background: true,\n silent: true,\n clearDraft: true,\n scheduleDate: number,\n noSound: boolean,\n\n waveform: Uint8Array,\n }> = {}) {\n peerId = appPeersManager.getPeerMigratedTo(peerId) || peerId;\n\n //this.checkSendOptions(options);\n\n const message = this.generateOutgoingMessage(peerId, options);\n const replyToMsgId = options.replyToMsgId ? appMessagesIdsManager.getServerMessageId(options.replyToMsgId) : undefined;\n\n let attachType: 'document' | 'audio' | 'video' | 'voice' | 'photo', apiFileName: string;\n\n const fileType = 'mime_type' in file ? file.mime_type : file.type;\n const fileName = file instanceof File ? file.name : '';\n const isDocument = !(file instanceof File) && !(file instanceof Blob);\n let caption = options.caption || '';\n\n this.log('sendFile', file, fileType);\n\n const entities = options.entities || [];\n if(caption) {\n caption = RichTextProcessor.parseMarkdown(caption, entities);\n }\n\n const attributes: DocumentAttribute[] = [];\n\n const isPhoto = IMAGE_MIME_TYPES_SUPPORTED.has(fileType);\n\n let photo: MyPhoto, document: MyDocument;\n\n let actionName: Extract<SendMessageAction['_'], 'sendMessageUploadAudioAction' | 'sendMessageUploadDocumentAction' | 'sendMessageUploadPhotoAction' | 'sendMessageUploadVideoAction'>;\n if(isDocument) { // maybe it's a sticker or gif\n attachType = 'document';\n apiFileName = '';\n } else if(fileType.indexOf('audio/') === 0 || ['video/ogg'].indexOf(fileType) >= 0) {\n attachType = 'audio';\n apiFileName = 'audio.' + (fileType.split('/')[1] === 'ogg' ? 'ogg' : 'mp3');\n actionName = 'sendMessageUploadAudioAction';\n\n if(options.isVoiceMessage) {\n attachType = 'voice';\n message.pFlags.media_unread = true;\n }\n\n let attribute: DocumentAttribute.documentAttributeAudio = {\n _: 'documentAttributeAudio',\n pFlags: {\n voice: options.isVoiceMessage\n },\n waveform: options.waveform,\n duration: options.duration || 0\n };\n\n attributes.push(attribute);\n } else if(!options.isMedia) {\n attachType = 'document';\n apiFileName = 'document.' + fileType.split('/')[1];\n actionName = 'sendMessageUploadDocumentAction';\n } else if(isPhoto) {\n attachType = 'photo';\n apiFileName = 'photo.' + fileType.split('/')[1];\n actionName = 'sendMessageUploadPhotoAction';\n\n const photoSize = {\n _: 'photoSize',\n w: options.width,\n h: options.height,\n type: 'full',\n location: null,\n size: file.size\n } as PhotoSize.photoSize;\n\n photo = {\n _: 'photo',\n id: '' + message.id,\n sizes: [photoSize],\n w: options.width,\n h: options.height\n } as any;\n\n const cacheContext = appDownloadManager.getCacheContext(photo, photoSize.type);\n cacheContext.downloaded = file.size;\n cacheContext.url = options.objectURL || '';\n \n photo = appPhotosManager.savePhoto(photo);\n } else if(VIDEO_MIME_TYPES_SUPPORTED.has(fileType)) {\n attachType = 'video';\n apiFileName = 'video.mp4';\n actionName = 'sendMessageUploadVideoAction';\n\n const videoAttribute: DocumentAttribute.documentAttributeVideo = {\n _: 'documentAttributeVideo',\n pFlags: {\n round_message: options.isRoundMessage,\n supports_streaming: true\n }, \n duration: options.duration,\n w: options.width,\n h: options.height\n };\n\n attributes.push(videoAttribute);\n\n // * must follow after video attribute\n if(options.noSound && \n file.size > (10 * 1024) && \n file.size < (10 * 1024 * 1024)) {\n attributes.push({\n _: 'documentAttributeAnimated'\n });\n }\n } else {\n attachType = 'document';\n apiFileName = 'document.' + fileType.split('/')[1];\n actionName = 'sendMessageUploadDocumentAction';\n }\n\n attributes.push({_: 'documentAttributeFilename', file_name: fileName || apiFileName});\n\n if((['document', 'video', 'audio', 'voice'] as (typeof attachType)[]).indexOf(attachType) !== -1 && !isDocument) {\n const thumbs: PhotoSize[] = [];\n document = {\n _: 'document',\n id: '' + message.id,\n duration: options.duration,\n attributes,\n w: options.width,\n h: options.height,\n thumbs,\n mime_type: fileType,\n size: file.size\n } as any;\n\n const cacheContext = appDownloadManager.getCacheContext(document);\n cacheContext.downloaded = file.size;\n cacheContext.url = options.objectURL || '';\n\n let thumb: PhotoSize.photoSize;\n if(isPhoto) {\n attributes.push({\n _: 'documentAttributeImageSize',\n w: options.width,\n h: options.height\n });\n\n thumb = {\n _: 'photoSize',\n w: options.width,\n h: options.height,\n type: 'full',\n size: file.size\n };\n } else if(attachType === 'video') {\n if(options.thumb) {\n thumb = {\n _: 'photoSize',\n w: options.thumb.size.width,\n h: options.thumb.size.height,\n type: 'local-thumb',\n size: options.thumb.blob.size\n };\n\n const thumbCacheContext = appDownloadManager.getCacheContext(document, thumb.type);\n thumbCacheContext.downloaded = thumb.size;\n thumbCacheContext.url = options.thumb.url;\n }\n }\n\n if(thumb) {\n thumbs.push(thumb);\n }\n\n /* if(thumbs.length) {\n const thumb = thumbs[0] as PhotoSize.photoSize;\n const docThumb = appPhotosManager.getDocumentCachedThumb(document.id);\n docThumb.downloaded = thumb.size;\n docThumb.url = thumb.url;\n } */\n \n document = appDocsManager.saveDoc(document);\n }\n\n this.log('sendFile', attachType, apiFileName, file.type, options);\n\n const preloader = isDocument ? undefined : new ProgressivePreloader({\n attachMethod: 'prepend',\n tryAgainOnFail: false,\n isUpload: true\n });\n\n const sentDeferred = deferredPromise<InputMedia>();\n\n if(preloader) {\n preloader.attachPromise(sentDeferred);\n sentDeferred.cancel = () => {\n const error = new Error('Download canceled');\n error.name = 'AbortError';\n sentDeferred.reject(error);\n };\n\n sentDeferred.catch(err => {\n if(err.name === 'AbortError' && !uploaded) {\n this.log('cancelling upload', media);\n\n this.cancelPendingMessage(message.random_id);\n this.setTyping(peerId, {_: 'sendMessageCancelAction'});\n\n if(uploadPromise?.cancel) {\n uploadPromise.cancel();\n }\n }\n });\n }\n\n const media = isDocument ? undefined : {\n _: photo ? 'messageMediaPhoto' : 'messageMediaDocument',\n pFlags: {},\n preloader,\n photo,\n document,\n promise: sentDeferred\n };\n\n message.entities = entities;\n message.message = caption;\n message.media = isDocument ? {\n _: 'messageMediaDocument',\n pFlags: {},\n document: file \n } as MessageMedia.messageMediaDocument : media as any;\n\n const toggleError = (on: boolean) => {\n if(on) {\n message.error = true;\n } else {\n delete message.error;\n }\n\n rootScope.dispatchEvent('messages_pending');\n };\n\n let uploaded = false,\n uploadPromise: ReturnType<ApiFileManager['uploadFile']> = null;\n\n message.send = () => {\n if(isDocument) {\n const {id, access_hash, file_reference} = file as MyDocument;\n\n const inputMedia: InputMedia = {\n _: 'inputMediaDocument',\n id: {\n _: 'inputDocument',\n id,\n access_hash,\n file_reference\n }\n };\n \n sentDeferred.resolve(inputMedia);\n } else if(file instanceof File || file instanceof Blob) {\n const load = () => {\n if(!uploaded || message.error) {\n uploaded = false;\n uploadPromise = appDownloadManager.upload(file);\n sentDeferred.notifyAll({done: 0, total: file.size});\n }\n\n let thumbUploadPromise: typeof uploadPromise;\n if(attachType === 'video' && options.objectURL) {\n thumbUploadPromise = new Promise((resolve, reject) => {\n const thumbPromise = options.thumb && options.thumb.blob ? Promise.resolve(options.thumb) : createPosterForVideo(options.objectURL);\n thumbPromise.then(thumb => {\n if(!thumb) {\n resolve(null);\n } else {\n appDownloadManager.upload(thumb.blob).then(resolve, reject);\n }\n }, reject);\n });\n }\n \n uploadPromise && uploadPromise.then(async(inputFile) => {\n /* if(DEBUG) {\n this.log('appMessagesManager: sendFile uploaded:', inputFile);\n } */\n\n // @ts-ignore\n delete message.media.preloader;\n\n inputFile.name = apiFileName;\n uploaded = true;\n let inputMedia: InputMedia;\n switch(attachType) {\n case 'photo':\n inputMedia = {\n _: 'inputMediaUploadedPhoto', \n file: inputFile,\n };\n break;\n\n default:\n inputMedia = {\n _: 'inputMediaUploadedDocument', \n file: inputFile, \n mime_type: fileType, \n pFlags: {\n force_file: actionName === 'sendMessageUploadDocumentAction' ? true : undefined,\n // nosound_video: options.noSound ? true : undefined\n },\n attributes\n };\n }\n\n if(thumbUploadPromise) {\n try {\n const inputFile = await thumbUploadPromise;\n (inputMedia as InputMedia.inputMediaUploadedDocument).thumb = inputFile;\n } catch(err) {\n this.log.error('sendFile thumb upload error:', err);\n }\n }\n \n sentDeferred.resolve(inputMedia);\n }, (/* error */) => {\n toggleError(true);\n });\n \n uploadPromise.addNotifyListener((progress: {done: number, total: number}) => {\n /* if(DEBUG) {\n this.log('upload progress', progress);\n } */\n\n const percents = Math.max(1, Math.floor(100 * progress.done / progress.total));\n if(actionName) {\n this.setTyping(peerId, {_: actionName, progress: percents | 0});\n }\n sentDeferred.notifyAll(progress);\n });\n\n return sentDeferred;\n };\n\n if(options.isGroupedItem) {\n load();\n } else {\n this.sendSmthLazyLoadQueue.push({\n load\n });\n }\n }\n\n return sentDeferred;\n };\n\n this.beforeMessageSending(message, {\n isGroupedItem: options.isGroupedItem, \n isScheduled: !!options.scheduleDate || undefined, \n threadId: options.threadId,\n clearDraft: options.clearDraft\n });\n\n if(!options.isGroupedItem) {\n sentDeferred.then(inputMedia => {\n this.setTyping(peerId, {_: 'sendMessageCancelAction'});\n\n return apiManager.invokeApi('messages.sendMedia', {\n background: options.background,\n peer: appPeersManager.getInputPeerById(peerId),\n media: inputMedia,\n message: caption,\n random_id: message.random_id,\n reply_to_msg_id: replyToMsgId,\n schedule_date: options.scheduleDate,\n silent: options.silent,\n entities,\n clear_draft: options.clearDraft\n }).then((updates) => {\n apiUpdatesManager.processUpdateMessage(updates);\n }, (error) => {\n if(attachType === 'photo' &&\n error.code === 400 &&\n (error.type === 'PHOTO_INVALID_DIMENSIONS' ||\n error.type === 'PHOTO_SAVE_FILE_INVALID')) {\n error.handled = true;\n attachType = 'document';\n message.send();\n return;\n }\n\n toggleError(true);\n throw error;\n });\n });\n\n sentDeferred.then(message.promise.resolve, message.promise.reject);\n }\n\n return {message, promise: sentDeferred};\n }\n\n public async sendAlbum(peerId: PeerId, files: File[], options: Partial<{\n isMedia: true,\n entities: MessageEntity[],\n replyToMsgId: number,\n threadId: number,\n caption: string,\n sendFileDetails: Partial<{\n duration: number,\n width: number,\n height: number,\n objectURL: string,\n thumbBlob: Blob,\n thumbURL: string\n }>[],\n silent: true,\n clearDraft: true,\n scheduleDate: number\n }> = {}) {\n //this.checkSendOptions(options);\n\n if(options.threadId && !options.replyToMsgId) {\n options.replyToMsgId = options.threadId;\n }\n\n if(files.length === 1) {\n return this.sendFile(peerId, files[0], {...options, ...options.sendFileDetails[0]});\n }\n\n peerId = appPeersManager.getPeerMigratedTo(peerId) || peerId;\n const replyToMsgId = options.replyToMsgId ? appMessagesIdsManager.getServerMessageId(options.replyToMsgId) : undefined;\n\n let caption = options.caption || '';\n let entities = options.entities || [];\n if(caption) {\n caption = RichTextProcessor.parseMarkdown(caption, entities);\n }\n\n this.log('sendAlbum', files, options);\n\n const groupId = '' + ++this.groupedTempId;\n\n const messages = files.map((file, idx) => {\n const details = options.sendFileDetails[idx];\n const o: Parameters<AppMessagesManager['sendFile']>[2] = {\n isGroupedItem: true,\n isMedia: options.isMedia,\n scheduleDate: options.scheduleDate,\n silent: options.silent,\n replyToMsgId,\n threadId: options.threadId,\n groupId,\n ...details\n };\n\n if(idx === 0) {\n o.caption = caption;\n o.entities = entities;\n //o.replyToMsgId = replyToMsgId;\n }\n\n return this.sendFile(peerId, file, o).message;\n });\n\n if(options.clearDraft) {\n setTimeout(() => {\n appDraftsManager.clearDraft(peerId, options.threadId);\n }, 0);\n }\n \n // * test pending\n //return;\n\n const toggleError = (message: any, on: boolean) => {\n if(on) {\n message.error = true;\n } else {\n delete message.error;\n }\n\n rootScope.dispatchEvent('messages_pending');\n };\n\n const inputPeer = appPeersManager.getInputPeerById(peerId);\n const invoke = (multiMedia: InputSingleMedia[]) => {\n this.setTyping(peerId, {_: 'sendMessageCancelAction'});\n\n const deferred = deferredPromise<void>();\n this.sendSmthLazyLoadQueue.push({\n load: () => {\n return apiManager.invokeApi('messages.sendMultiMedia', {\n peer: inputPeer,\n multi_media: multiMedia,\n reply_to_msg_id: replyToMsgId,\n schedule_date: options.scheduleDate,\n silent: options.silent,\n clear_draft: options.clearDraft\n }).then((updates) => {\n apiUpdatesManager.processUpdateMessage(updates);\n deferred.resolve();\n }, (error) => {\n messages.forEach(message => toggleError(message, true));\n deferred.reject(error);\n });\n }\n });\n\n return deferred;\n };\n\n const promises: Promise<InputSingleMedia>[] = messages.map((message) => {\n return (message.send() as Promise<InputMedia>).then((inputMedia) => {\n return apiManager.invokeApi('messages.uploadMedia', {\n peer: inputPeer,\n media: inputMedia\n });\n })\n .then(messageMedia => {\n let inputMedia: InputMedia;\n if(messageMedia._ === 'messageMediaPhoto') {\n const photo = appPhotosManager.savePhoto(messageMedia.photo);\n inputMedia = appPhotosManager.getMediaInput(photo);\n } else if(messageMedia._ === 'messageMediaDocument') {\n const doc = appDocsManager.saveDoc(messageMedia.document);\n inputMedia = appDocsManager.getMediaInput(doc);\n }\n\n const inputSingleMedia: InputSingleMedia = {\n _: 'inputSingleMedia',\n media: inputMedia,\n random_id: message.random_id,\n message: caption,\n entities\n };\n\n // * only 1 caption for all inputs\n if(caption) {\n caption = '';\n entities = [];\n }\n\n return inputSingleMedia;\n }).catch((err: any) => {\n if(err.name === 'AbortError') {\n return null;\n }\n\n this.log.error('sendAlbum upload item error:', err, message);\n toggleError(message, true);\n throw err;\n });\n });\n\n return Promise.all(promises).then(inputs => {\n return invoke(inputs.filter(Boolean));\n });\n }\n\n public sendContact(peerId: PeerId, contactPeerId: PeerId) {\n return this.sendOther(peerId, appUsersManager.getContactMediaInput(contactPeerId));\n }\n\n public sendOther(peerId: PeerId, inputMedia: InputMedia, options: Partial<{\n replyToMsgId: number,\n threadId: number,\n viaBotId: BotId,\n replyMarkup: ReplyMarkup,\n clearDraft: true,\n queryId: string\n resultId: string,\n scheduleDate: number,\n silent: true,\n geoPoint: GeoPoint\n }> = {}) {\n peerId = appPeersManager.getPeerMigratedTo(peerId) || peerId;\n\n //this.checkSendOptions(options);\n const message = this.generateOutgoingMessage(peerId, options);\n const replyToMsgId = options.replyToMsgId ? appMessagesIdsManager.getServerMessageId(options.replyToMsgId) : undefined;\n\n let media: MessageMedia;\n switch(inputMedia._) {\n case 'inputMediaPoll': {\n const pollId = '' + message.id;\n inputMedia.poll.id = pollId;\n appPollsManager.savePoll(inputMedia.poll, {\n _: 'pollResults',\n flags: 4,\n total_voters: 0,\n pFlags: {},\n recent_voters: []\n });\n\n const {poll, results} = appPollsManager.getPoll(pollId);\n media = {\n _: 'messageMediaPoll',\n poll,\n results\n };\n\n break;\n }\n\n case 'inputMediaPhoto': {\n media = {\n _: 'messageMediaPhoto',\n photo: appPhotosManager.getPhoto((inputMedia.id as InputPhoto.inputPhoto).id)\n };\n break;\n }\n\n case 'inputMediaDocument': {\n const doc = appDocsManager.getDoc((inputMedia.id as InputDocument.inputDocument).id);\n /* if(doc.sticker && doc.stickerSetInput) {\n appStickersManager.pushPopularSticker(doc.id);\n } */\n media = {\n _: 'messageMediaDocument',\n document: doc\n };\n break;\n }\n\n case 'inputMediaContact': {\n media = {\n _: 'messageMediaContact',\n phone_number: inputMedia.phone_number,\n first_name: inputMedia.first_name,\n last_name: inputMedia.last_name,\n user_id: inputMedia.user_id ?? '0',\n vcard: inputMedia.vcard\n };\n break;\n }\n\n case 'inputMediaGeoPoint': {\n media = {\n _: 'messageMediaGeo',\n geo: options.geoPoint\n };\n break;\n }\n\n case 'inputMediaVenue': {\n media = {\n _: 'messageMediaVenue',\n geo: options.geoPoint,\n title: inputMedia.title,\n address: inputMedia.address,\n provider: inputMedia.provider,\n venue_id: inputMedia.venue_id,\n venue_type: inputMedia.venue_type\n };\n break;\n }\n \n // @ts-ignore\n case 'messageMediaPending': {\n media = inputMedia;\n break;\n }\n }\n\n message.media = media;\n\n let toggleError = (on: boolean) => {\n /* const historyMessage = this.messagesForHistory[messageId];\n if (on) {\n message.error = true\n if (historyMessage) {\n historyMessage.error = true\n }\n } else {\n delete message.error\n if (historyMessage) {\n delete historyMessage.error\n }\n } */\n rootScope.dispatchEvent('messages_pending');\n };\n\n message.send = () => {\n const sentRequestOptions: PendingAfterMsg = {};\n if(this.pendingAfterMsgs[peerId]) {\n sentRequestOptions.afterMessageId = this.pendingAfterMsgs[peerId].messageId;\n }\n\n let apiPromise: Promise<any>;\n if(options.viaBotId) {\n apiPromise = apiManager.invokeApiAfter('messages.sendInlineBotResult', {\n peer: appPeersManager.getInputPeerById(peerId),\n random_id: message.random_id,\n reply_to_msg_id: replyToMsgId || undefined,\n query_id: options.queryId,\n id: options.resultId,\n clear_draft: options.clearDraft,\n schedule_date: options.scheduleDate,\n silent: options.silent\n }, sentRequestOptions);\n } else {\n apiPromise = apiManager.invokeApiAfter('messages.sendMedia', {\n peer: appPeersManager.getInputPeerById(peerId),\n media: inputMedia,\n random_id: message.random_id,\n reply_to_msg_id: replyToMsgId || undefined,\n message: '',\n clear_draft: options.clearDraft,\n schedule_date: options.scheduleDate,\n silent: options.silent\n }, sentRequestOptions);\n }\n\n this.pendingAfterMsgs[peerId] = sentRequestOptions;\n\n return apiPromise.then((updates) => {\n if(updates.updates) {\n updates.updates.forEach((update: Update) => {\n if(update._ === 'updateDraftMessage') {\n update.local = true;\n }\n });\n }\n\n apiUpdatesManager.processUpdateMessage(updates);\n }, (error) => {\n toggleError(true);\n }).finally(() => {\n if(this.pendingAfterMsgs[peerId] === sentRequestOptions) {\n delete this.pendingAfterMsgs[peerId];\n }\n });\n };\n\n this.beforeMessageSending(message, {\n isScheduled: !!options.scheduleDate || undefined, \n threadId: options.threadId,\n clearDraft: options.clearDraft\n });\n\n return message.promise;\n }\n\n /* private checkSendOptions(options: Partial<{\n scheduleDate: number\n }>) {\n if(options.scheduleDate) {\n const minTimestamp = (Date.now() / 1000 | 0) + 10;\n if(options.scheduleDate <= minTimestamp) {\n delete options.scheduleDate;\n }\n }\n } */\n\n private beforeMessageSending(message: Message.message, options: Partial<{\n isGroupedItem: true, \n isScheduled: true, \n threadId: number, \n clearDraft: true\n }> = {}) {\n const messageId = message.id;\n const peerId = this.getMessagePeer(message);\n const storage = options.isScheduled ? this.getScheduledMessagesStorage(peerId) : this.getMessagesStorage(peerId);\n\n if(options.isScheduled) {\n //if(!options.isGroupedItem) {\n this.saveMessages([message], {storage, isScheduled: true, isOutgoing: true});\n setTimeout(() => {\n rootScope.dispatchEvent('scheduled_new', {peerId, mid: messageId});\n }, 0);\n } else {\n /* if(options.threadId && this.threadsStorage[peerId]) {\n delete this.threadsStorage[peerId][options.threadId];\n } */\n const storages: HistoryStorage[] = [\n this.getHistoryStorage(peerId),\n options.threadId ? this.getHistoryStorage(peerId, options.threadId) : undefined\n ];\n\n for(const storage of storages) {\n if(storage) {\n storage.history.unshift(messageId);\n }\n }\n\n //if(!options.isGroupedItem) {\n this.saveMessages([message], {storage, isOutgoing: true});\n this.setDialogTopMessage(message);\n setTimeout(() => {\n rootScope.dispatchEvent('history_append', {storage, peerId, mid: messageId});\n }, 0);\n }\n\n this.pendingByRandomId[message.random_id] = {\n peerId, \n tempId: messageId, \n threadId: options.threadId, \n storage\n };\n\n if(!options.isGroupedItem && message.send) {\n setTimeout(() => {\n if(options.clearDraft) {\n appDraftsManager.clearDraft(peerId, options.threadId);\n }\n\n message.send();\n }, 0);\n }\n }\n\n private generateOutgoingMessage(peerId: PeerId, options: Partial<{\n scheduleDate: number,\n replyToMsgId: number,\n threadId: number,\n viaBotId: BotId,\n groupId: string,\n replyMarkup: ReplyMarkup,\n }>) {\n if(options.threadId && !options.replyToMsgId) {\n options.replyToMsgId = options.threadId;\n }\n\n let postAuthor: string;\n const isBroadcast = appPeersManager.isBroadcast(peerId);\n if(isBroadcast) {\n const chat = appPeersManager.getPeer(peerId) as Chat.channel;\n if(chat.pFlags.signatures) {\n const user = appUsersManager.getSelf();\n const fullName = user.first_name + (user.last_name ? ' ' + user.last_name : '');\n postAuthor = fullName;\n }\n }\n\n const message: Message.message = {\n _: 'message',\n id: this.generateTempMessageId(peerId),\n from_id: this.generateFromId(peerId),\n peer_id: appPeersManager.getOutputPeer(peerId),\n post_author: postAuthor, \n pFlags: this.generateFlags(peerId),\n date: options.scheduleDate || (tsNow(true) + serverTimeManager.serverTimeOffset),\n message: '',\n grouped_id: options.groupId,\n random_id: randomLong(),\n reply_to: this.generateReplyHeader(options.replyToMsgId, options.threadId),\n via_bot_id: options.viaBotId,\n reply_markup: options.replyMarkup,\n replies: this.generateReplies(peerId),\n views: isBroadcast && 1,\n pending: true,\n promise: options.groupId === undefined ? deferredPromise() : undefined\n };\n\n return message;\n }\n\n private generateReplyHeader(replyToMsgId: number, replyToTopId?: number) {\n const header = {\n _: 'messageReplyHeader',\n reply_to_msg_id: replyToMsgId || replyToTopId,\n } as MessageReplyHeader;\n\n if(replyToTopId && header.reply_to_msg_id !== replyToTopId) {\n header.reply_to_top_id = replyToTopId;\n }\n\n return header;\n }\n\n private generateReplies(peerId: PeerId) {\n let replies: MessageReplies.messageReplies;\n if(appPeersManager.isBroadcast(peerId)) {\n const channelFull = appProfileManager.chatsFull[peerId.toChatId()] as ChatFull.channelFull;\n if(channelFull?.linked_chat_id) {\n replies = {\n _: 'messageReplies',\n flags: 1,\n pFlags: {\n comments: true\n },\n channel_id: channelFull.linked_chat_id,\n replies: 0,\n replies_pts: 0\n };\n }\n }\n\n return replies;\n }\n\n /**\n * Generate correct from_id according to anonymous or broadcast\n */\n private generateFromId(peerId: PeerId) {\n if(peerId.isAnyChat() && (peerId.isBroadcast() || this.isAnonymousSending(peerId))) {\n return undefined;\n } else {\n return appPeersManager.getOutputPeer(appUsersManager.getSelf().id.toPeerId());\n }\n }\n\n private generateFlags(peerId: PeerId) {\n const pFlags: Message.message['pFlags'] = {};\n const fromId = appUsersManager.getSelf().id;\n if(peerId !== fromId) {\n pFlags.out = true;\n\n if(!appPeersManager.isChannel(peerId) && !appUsersManager.isBot(peerId)) {\n pFlags.unread = true;\n }\n }\n\n if(appPeersManager.isBroadcast(peerId)) {\n pFlags.post = true;\n }\n\n return pFlags;\n }\n\n private generateForwardHeader(peerId: PeerId, originalMessage: Message.message) {\n const myId = appUsersManager.getSelf().id.toPeerId();\n if(originalMessage.fromId === myId && originalMessage.peerId === myId && !originalMessage.fwd_from) {\n return;\n }\n\n const fwdHeader: MessageFwdHeader.messageFwdHeader = {\n _: 'messageFwdHeader',\n flags: 0,\n date: originalMessage.date\n };\n\n if(originalMessage.fwd_from) {\n fwdHeader.from_id = originalMessage.fwd_from.from_id;\n fwdHeader.from_name = originalMessage.fwd_from.from_name;\n fwdHeader.post_author = originalMessage.fwd_from.post_author;\n } else {\n fwdHeader.from_id = appPeersManager.getOutputPeer(originalMessage.fromId);\n fwdHeader.post_author = originalMessage.post_author;\n }\n\n if(appPeersManager.isBroadcast(originalMessage.peerId)) {\n if(originalMessage.post_author) {\n fwdHeader.post_author = originalMessage.post_author;\n }\n\n fwdHeader.channel_post = originalMessage.id;\n }\n \n // * there is no way to detect whether user profile is hidden\n if(peerId === myId) {\n fwdHeader.saved_from_msg_id = originalMessage.id;\n fwdHeader.saved_from_peer = appPeersManager.getOutputPeer(originalMessage.peerId);\n }\n\n return fwdHeader;\n }\n\n public generateFakeAvatarMessage(peerId: PeerId, photo: Photo) {\n const maxId = Number.MAX_SAFE_INTEGER;\n const message = {\n _: 'messageService',\n action: {\n _: 'messageActionChannelEditPhoto',\n photo\n },\n mid: maxId,\n peerId,\n date: (photo as Photo.photo).date,\n fromId: peerId\n } as Message.messageService;\n\n this.getMessagesStorage(peerId).set(maxId, message);\n return message;\n }\n\n public isAnonymousSending(peerId: PeerId): boolean {\n return peerId.isAnyChat() && appPeersManager.getPeer(peerId).admin_rights?.pFlags?.anonymous;\n }\n\n public setDialogTopMessage(message: MyMessage, dialog: MTDialog.dialog = this.getDialogOnly(message.peerId)) {\n if(dialog) {\n dialog.top_message = message.mid;\n \n const historyStorage = this.getHistoryStorage(message.peerId);\n historyStorage.maxId = message.mid;\n\n this.dialogsStorage.generateIndexForDialog(dialog, false, message);\n\n this.scheduleHandleNewDialogs(message.peerId, dialog);\n }\n }\n\n public cancelPendingMessage(randomId: string) {\n const pendingData = this.pendingByRandomId[randomId];\n\n /* if(DEBUG) {\n this.log('cancelPendingMessage', randomId, pendingData);\n } */\n\n if(pendingData) {\n const {peerId, tempId, storage} = pendingData;\n const historyStorage = this.getHistoryStorage(peerId);\n\n apiUpdatesManager.processLocalUpdate({\n _: 'updateDeleteMessages',\n messages: [tempId],\n pts: undefined,\n pts_count: undefined\n });\n\n historyStorage.history.delete(tempId);\n\n delete this.pendingByRandomId[randomId];\n storage.delete(tempId);\n\n return true;\n }\n\n return false;\n }\n\n /* public async refreshConversations() {\n const limit = 200, outDialogs: Dialog[] = [];\n for(let folderId = 0; folderId < 2; ++folderId) {\n let offsetDate = 0;\n for(;;) {\n const {dialogs, isEnd} = await this.getTopMessages(limit, folderId, offsetDate);\n \n if(dialogs.length) {\n outDialogs.push(...dialogs as Dialog[]);\n const dialog = dialogs[dialogs.length - 1];\n\n // * get peerId and mid manually, because dialog can be migrated peer and it won't be saved\n const peerId = appPeersManager.getPeerId(dialog.peer);\n const mid = appMessagesIdsManager.generateMessageId(dialog.top_message);\n offsetDate = this.getMessageByPeer(peerId, mid).date;\n\n if(!offsetDate) {\n console.error('refreshConversations: got no offsetDate', dialog);\n break;\n }\n }\n \n if(isEnd) {\n break;\n }\n }\n }\n\n let obj: {[peerId: string]: Dialog} = {};\n outDialogs.forEach(dialog => {\n obj[dialog.peerId] = dialog;\n });\n rootScope.dispatchEvent('dialogs_multiupdate', obj);\n\n return outDialogs;\n } */\n\n public async fillConversations(): Promise<void> {\n const middleware = this.middleware.get();\n while(!this.dialogsStorage.isDialogsLoaded(GLOBAL_FOLDER_ID)) {\n const result = await this.getTopMessages(100, GLOBAL_FOLDER_ID);\n if(!middleware() || result.isEnd) {\n break;\n }\n }\n }\n\n /* public async getConversationsAll(query = '', folderId = 0) {\n const limit = 200, outDialogs: Dialog[] = [];\n for(; folderId < 2; ++folderId) {\n let offsetIndex = 0;\n for(;;) {\n const {dialogs} = await appMessagesManager.getConversations(query, offsetIndex, limit, folderId).promise;\n \n if(dialogs.length) {\n outDialogs.push(...dialogs);\n offsetIndex = dialogs[dialogs.length - 1].index || 0;\n } else {\n break;\n }\n }\n }\n\n return outDialogs;\n } */\n\n public getConversations(query = '', offsetIndex?: number, limit?: number, folderId = 0, skipMigrated?: boolean) {\n return this.dialogsStorage.getDialogs(query, offsetIndex, limit, folderId, skipMigrated);\n }\n\n public getReadMaxIdIfUnread(peerId: PeerId, threadId?: number) {\n const historyStorage = this.getHistoryStorage(peerId, threadId);\n if(threadId) {\n const chatHistoryStorage = this.getHistoryStorage(peerId);\n const readMaxId = Math.max(chatHistoryStorage.readMaxId ?? 0, historyStorage.readMaxId);\n const message = this.getMessageByPeer(peerId, historyStorage.maxId); // usually message is missing, so pFlags.out won't be there anyway\n return !message.pFlags.out && readMaxId < historyStorage.maxId ? readMaxId : 0;\n } else {\n const message = this.getMessageByPeer(peerId, historyStorage.maxId);\n const readMaxId = peerId.isUser() ? Math.max(historyStorage.readMaxId, historyStorage.readOutboxMaxId) : historyStorage.readMaxId;\n return !message.pFlags.out && readMaxId < historyStorage.maxId ? readMaxId : 0;\n }\n }\n\n // public lolSet = new Set();\n public getTopMessages(limit: number, folderId: number, offsetDate?: number) {\n //const dialogs = this.dialogsStorage.getFolder(folderId);\n let offsetId = 0;\n let offsetPeerId: PeerId;\n let offsetIndex = 0;\n\n if(offsetDate === undefined) {\n offsetDate = this.dialogsStorage.getOffsetDate(folderId);\n }\n\n if(offsetDate) {\n offsetIndex = offsetDate * 0x10000;\n offsetDate += serverTimeManager.serverTimeOffset;\n }\n\n const useLimit = 100;\n const middleware = this.middleware.get();\n\n // ! ВНИМАНИЕ: ОЧЕНЬ СЛОЖНАЯ ЛОГИКА:\n // ! если делать запрос сначала по папке 0, потом по папке 1, по индексу 0 в массиве будет один и тот же диалог, с dialog.pFlags.pinned, ЛОЛ???\n // ! т.е., с запросом folder_id: 1, и exclude_pinned: 0, в результате будут ещё и закреплённые с папки 0\n const params: MessagesGetDialogs = {\n folder_id: folderId,\n offset_date: offsetDate,\n offset_id: offsetId,\n offset_peer: appPeersManager.getInputPeerById(offsetPeerId),\n limit: useLimit,\n hash: '0'\n };\n\n return apiManager.invokeApiSingle('messages.getDialogs', params, {\n //timeout: APITIMEOUT,\n noErrorBox: true\n }).then((dialogsResult) => {\n if(!middleware() || dialogsResult._ === 'messages.dialogsNotModified') return null;\n\n if(DEBUG) {\n this.log('messages.getDialogs result:', dialogsResult.dialogs, {...dialogsResult.dialogs[0]});\n }\n\n /* if(!offsetDate) {\n telegramMeWebService.setAuthorized(true);\n } */\n\n // can reset pinned order here\n if(!offsetId && !offsetDate && !offsetPeerId && folderId !== GLOBAL_FOLDER_ID) {\n this.dialogsStorage.resetPinnedOrder(folderId);\n }\n\n if(!offsetDate) {\n telegramMeWebManager.setAuthorized(true);\n }\n\n appUsersManager.saveApiUsers(dialogsResult.users);\n appChatsManager.saveApiChats(dialogsResult.chats);\n this.saveMessages(dialogsResult.messages);\n\n /* if(folderId === 0 && !offsetDate) {\n const found = dialogsResult.dialogs.find(dialog => appPeersManager.getPeerId(dialog.peer) === -1325963535);\n if(!found) {\n debugger;\n }\n } */\n\n let maxSeenIdIncremented = offsetDate ? true : false;\n let hasPrepend = false;\n const noIdsDialogs: {[peerId: PeerId]: Dialog} = {};\n const setFolderId = folderId === GLOBAL_FOLDER_ID ? 0 : folderId;\n const saveGlobalOffset = folderId === GLOBAL_FOLDER_ID;\n forEachReverse((dialogsResult.dialogs as Dialog[]), dialog => {\n //const d = Object.assign({}, dialog);\n // ! нужно передавать folderId, так как по папке !== 0 нет свойства folder_id\n if(dialog.folder_id === undefined) {\n dialog.folder_id = setFolderId;\n }\n\n this.dialogsStorage.saveDialog(dialog, undefined, true, saveGlobalOffset);\n\n if(!maxSeenIdIncremented &&\n !appPeersManager.isChannel(dialog.peerId || appPeersManager.getPeerId(dialog.peer))) {\n this.incrementMaxSeenId(dialog.top_message);\n maxSeenIdIncremented = true;\n }\n\n if(dialog.peerId === undefined) {\n return;\n }\n\n // if(!folderId && !dialog.folder_id) {\n // this.lolSet.add(dialog.peerId);\n // }\n\n /* if(dialog.peerId === -1213511294) {\n this.log.error('lun bot', folderId, d);\n } */\n\n if(offsetIndex && dialog.index > offsetIndex) {\n this.scheduleHandleNewDialogs(dialog.peerId, dialog);\n hasPrepend = true;\n }\n\n // ! это может случиться, если запрос идёт не по папке 0, а по 1. почему-то read'ов нет\n // ! в итоге, чтобы получить 1 диалог, делается первый запрос по папке 0, потом запрос для архивных по папке 1, и потом ещё перезагрузка архивного диалога\n if(!appMessagesIdsManager.getServerMessageId(dialog.read_inbox_max_id) && !appMessagesIdsManager.getServerMessageId(dialog.read_outbox_max_id)) {\n noIdsDialogs[dialog.peerId] = dialog;\n\n this.log.error('noIdsDialogs', dialog, params);\n\n /* if(dialog.peerId === -1213511294) {\n this.log.error('lun bot', folderId);\n } */\n }\n });\n\n const keys = Object.keys(noIdsDialogs);\n if(keys.length) {\n //setTimeout(() => { // test bad situation\n const peerIds = keys.map(key => key.toPeerId());\n const promises = peerIds.map(peerId => this.reloadConversation(peerId));\n Promise.all(promises).then(() => {\n rootScope.dispatchEvent('dialogs_multiupdate', noIdsDialogs);\n \n for(let i = 0; i < peerIds.length; ++i) {\n rootScope.dispatchEvent('dialog_unread', {peerId: peerIds[i]});\n }\n });\n //}, 10e3);\n }\n\n const count = (dialogsResult as MessagesDialogs.messagesDialogsSlice).count;\n\n // exclude empty draft dialogs\n const folderDialogs = this.dialogsStorage.getFolderDialogs(folderId, false);\n let dialogsLength = 0;\n for(let i = 0, length = folderDialogs.length; i < length; ++i) {\n if(appMessagesIdsManager.getServerMessageId(folderDialogs[i].top_message)) {\n ++dialogsLength;\n }\n }\n\n const isEnd = /* limit > dialogsResult.dialogs.length || */ \n !count || \n dialogsLength >= count ||\n !dialogsResult.dialogs.length;\n if(isEnd) {\n this.dialogsStorage.setDialogsLoaded(folderId, true);\n }\n\n if(hasPrepend) {\n this.scheduleHandleNewDialogs();\n } else {\n rootScope.dispatchEvent('dialogs_multiupdate', {});\n }\n\n const dialogs = (dialogsResult as MessagesDialogs.messagesDialogsSlice).dialogs;\n const slicedDialogs = limit === useLimit ? dialogs : dialogs.slice(0, limit);\n return {\n isEnd: isEnd && slicedDialogs[slicedDialogs.length - 1] === dialogs[dialogs.length - 1], \n count, \n dialogs: slicedDialogs\n };\n });\n }\n\n public forwardMessages(peerId: PeerId, fromPeerId: PeerId, mids: number[], options: Partial<{\n withMyScore: true,\n silent: true,\n scheduleDate: number,\n dropAuthor: boolean,\n dropCaptions: boolean\n }> = {}) {\n peerId = appPeersManager.getPeerMigratedTo(peerId) || peerId;\n mids = mids.slice().sort((a, b) => a - b);\n\n for(let i = 0, length = mids.length; i < length; ++i) {\n const mid = mids[i];\n const originalMessage: Message.message = this.getMessageByPeer(fromPeerId, mid);\n if(originalMessage.pFlags.is_outgoing) { // this can happen when forwarding a changelog\n this.sendText(peerId, originalMessage.message, {\n entities: originalMessage.entities,\n scheduleDate: options.scheduleDate,\n silent: options.silent\n });\n\n mids.splice(i--, 1);\n }\n }\n\n if(!mids.length) {\n return Promise.resolve();\n }\n\n if(options.dropCaptions) {\n options.dropAuthor = true;\n }\n\n const groups: {\n [groupId: string]: {\n tempId: string,\n messages: Message.message[]\n }\n } = {};\n\n const newMessages = mids.map(mid => {\n const originalMessage: Message.message = this.getMessageByPeer(fromPeerId, mid);\n const message: Message.message = this.generateOutgoingMessage(peerId, options);\n\n const keys: Array<keyof Message.message> = [\n 'entities', \n 'media', \n // 'reply_markup'\n ];\n\n if(!options.dropAuthor) {\n message.fwd_from = this.generateForwardHeader(peerId, originalMessage);\n keys.push('views', 'forwards');\n }\n\n if(!options.dropCaptions || !originalMessage.media) {\n keys.push('message');\n }\n\n keys.forEach(key => {\n // @ts-ignore\n message[key] = originalMessage[key];\n });\n\n const document = (message.media as MessageMedia.messageMediaDocument)?.document as MyDocument;\n if(document) {\n const types: MyDocument['type'][] = ['round', 'voice'];\n if(types.includes(document.type)) {\n (message as MyMessage).pFlags.media_unread = true;\n }\n }\n\n if(originalMessage.grouped_id) {\n const group = groups[originalMessage.grouped_id] ?? (groups[originalMessage.grouped_id] = {tempId: '' + ++this.groupedTempId, messages: []});\n group.messages.push(message);\n }\n\n return message;\n });\n\n for(const groupId in groups) {\n const group = groups[groupId];\n if(group.messages.length > 1) {\n group.messages.forEach(message => {\n message.grouped_id = group.tempId;\n });\n }\n }\n\n newMessages.forEach(message => {\n this.beforeMessageSending(message, {\n isScheduled: !!options.scheduleDate || undefined\n });\n });\n\n const sentRequestOptions: PendingAfterMsg = {};\n if(this.pendingAfterMsgs[peerId]) {\n sentRequestOptions.afterMessageId = this.pendingAfterMsgs[peerId].messageId;\n }\n\n const promise = /* true ? Promise.resolve() : */apiManager.invokeApiAfter('messages.forwardMessages', {\n from_peer: appPeersManager.getInputPeerById(fromPeerId),\n id: mids.map(mid => appMessagesIdsManager.getServerMessageId(mid)),\n random_id: newMessages.map(message => message.random_id),\n to_peer: appPeersManager.getInputPeerById(peerId),\n with_my_score: options.withMyScore,\n silent: options.silent,\n schedule_date: options.scheduleDate,\n drop_author: options.dropAuthor,\n drop_media_captions: options.dropCaptions\n }, sentRequestOptions).then((updates) => {\n this.log('forwardMessages updates:', updates);\n apiUpdatesManager.processUpdateMessage(updates);\n }).finally(() => {\n if(this.pendingAfterMsgs[peerId] === sentRequestOptions) {\n delete this.pendingAfterMsgs[peerId];\n }\n });\n\n this.pendingAfterMsgs[peerId] = sentRequestOptions;\n return promise;\n }\n\n public generateEmptyMessage(mid: number): Message.messageEmpty {\n return {\n _: 'messageEmpty',\n id: appMessagesIdsManager.getServerMessageId(mid),\n mid,\n deleted: true,\n pFlags: {}\n };\n }\n\n public getMessageFromStorage(storage: MessagesStorage, mid: number) {\n return storage && storage.get(mid) || this.generateEmptyMessage(mid);\n }\n\n private createMessageStorage() {\n const storage: MessagesStorage = new Map();\n \n /* let num = 0;\n Object.defineProperty(storage, 'num', {\n get: () => ++num,\n set: (_num: number) => num = _num, \n enumerable: false\n });\n\n Object.defineProperty(storage, 'generateIndex', {\n value: (message: any) => {\n if(message.index === undefined) {\n message.index = (message.date * 0x10000) + (storage.num & 0xFFFF);\n }\n },\n enumerable: false\n }); */\n\n return storage;\n }\n\n public getMessagesStorage(peerId: PeerId) {\n return this.messagesStorageByPeerId[peerId] ?? (this.messagesStorageByPeerId[peerId] = this.createMessageStorage());\n }\n\n public getMessageById(messageId: number) {\n for(const peerId in this.messagesStorageByPeerId) {\n if(appPeersManager.isChannel(peerId.toPeerId())) {\n continue;\n }\n\n const message = this.messagesStorageByPeerId[peerId].get(messageId);\n if(message) {\n return message;\n }\n }\n\n return this.getMessageFromStorage(null, messageId);\n }\n\n public getMessageByPeer(peerId: PeerId, messageId: number) {\n if(!peerId) {\n return this.getMessageById(messageId);\n }\n\n return this.getMessageFromStorage(this.getMessagesStorage(peerId), messageId);\n }\n\n public getMessagePeer(message: any): PeerId {\n const toId = message.peer_id && appPeersManager.getPeerId(message.peer_id) || NULL_PEER_ID;\n\n return toId;\n }\n\n public getDialogByPeerId(peerId: PeerId): [Dialog, number] | [] {\n return this.dialogsStorage.getDialog(peerId);\n }\n\n public getDialogOnly(peerId: PeerId) {\n return this.dialogsStorage.getDialogOnly(peerId);\n }\n\n public reloadConversation(inputPeer?: PeerId | InputPeer): CancellablePromise<Dialog>;\n public reloadConversation(inputPeer: PeerId | InputPeer) {\n let promise: CancellablePromise<Dialog>;\n if(inputPeer !== undefined) {\n const peerId = appPeersManager.getPeerId(inputPeer);\n let obj = this.reloadConversationsPeers.get(peerId);\n if(obj) {\n promise = obj.promise;\n }\n\n if(promise) {\n return promise;\n }\n\n promise = deferredPromise();\n this.reloadConversationsPeers.set(peerId, obj = {\n inputDialogPeer: appPeersManager.getInputDialogPeerById(inputPeer),\n promise\n });\n }\n\n if(this.reloadConversationsPromise) {\n return promise || this.reloadConversationsPromise;\n }\n\n this.reloadConversationsPromise = new Promise((resolve, reject) => {\n setTimeout(() => {\n const inputDialogPeers: InputDialogPeer[] = [];\n const promises: {[peerId: string]: typeof promise} = {};\n for(const [peerId, {inputDialogPeer, promise}] of this.reloadConversationsPeers) {\n inputDialogPeers.push(inputDialogPeer);\n promises[peerId] = promise;\n }\n\n this.reloadConversationsPeers.clear();\n\n const fullfillLeft = () => {\n for(const peerId in promises) {\n promises[peerId].resolve(undefined);\n }\n };\n\n apiManager.invokeApi('messages.getPeerDialogs', {peers: inputDialogPeers}).then((result) => {\n this.dialogsStorage.applyDialogs(result);\n\n result.dialogs.forEach((dialog) => {\n const peerId = dialog.peerId;\n if(peerId) {\n promises[peerId].resolve(dialog as Dialog);\n delete promises[peerId];\n }\n });\n\n fullfillLeft();\n resolve();\n }, (err) => {\n fullfillLeft();\n reject(err);\n }).finally(() => {\n this.reloadConversationsPromise = null;\n\n if(this.reloadConversationsPeers.size) {\n this.reloadConversation();\n }\n });\n }, 0);\n });\n\n return promise || this.reloadConversationsPromise;\n }\n\n private doFlushHistory(peer: InputPeer, just_clear?: boolean, revoke?: boolean): Promise<true> {\n return apiManager.invokeApiSingle('messages.deleteHistory', {\n just_clear,\n revoke,\n peer,\n max_id: 0\n }).then((affectedHistory) => {\n apiUpdatesManager.processUpdateMessage({\n _: 'updateShort',\n update: {\n _: 'updatePts',\n pts: affectedHistory.pts,\n pts_count: affectedHistory.pts_count\n }\n });\n\n if(!affectedHistory.offset) {\n return true;\n }\n\n return this.doFlushHistory(peer, just_clear, revoke);\n });\n }\n\n public async flushHistory(peerId: PeerId, justClear?: boolean, revoke?: boolean) {\n if(appPeersManager.isChannel(peerId)) {\n const promise = this.getHistory(peerId, 0, 1);\n\n const historyResult = promise instanceof Promise ? await promise : promise;\n\n const channelId = peerId.toChatId();\n const maxId = historyResult.history[0] || 0;\n return apiManager.invokeApiSingle('channels.deleteHistory', {\n channel: appChatsManager.getChannelInput(channelId),\n max_id: appMessagesIdsManager.getServerMessageId(maxId)\n }).then((bool) => {\n if(bool) {\n apiUpdatesManager.processLocalUpdate({\n _: 'updateChannelAvailableMessages',\n channel_id: channelId,\n available_min_id: maxId\n });\n }\n\n return bool;\n });\n }\n\n return this.doFlushHistory(appPeersManager.getInputPeerById(peerId), justClear, revoke).then(() => {\n [\n this.historiesStorage, \n this.threadsStorage, \n this.searchesStorage, \n this.pinnedMessages,\n this.pendingAfterMsgs,\n this.pendingTopMsgs\n ].forEach(s => {\n delete s[peerId];\n });\n\n const m = this.needSingleMessages.get(peerId);\n if(m) {\n m.clear();\n }\n\n [\n this.messagesStorageByPeerId,\n this.scheduledMessagesStorage\n ].forEach(s => {\n const ss = s[peerId];\n if(ss) {\n ss.clear();\n }\n });\n \n if(justClear) {\n rootScope.dispatchEvent('dialog_flush', {peerId});\n } else {\n delete this.notificationsToHandle[peerId];\n delete this.typings[peerId];\n \n const c = this.reloadConversationsPeers.get(peerId);\n if(c) {\n this.reloadConversationsPeers.delete(peerId);\n c.promise.resolve(undefined);\n }\n\n this.dialogsStorage.dropDialogOnDeletion(peerId);\n }\n });\n }\n\n public onPeerDeleted(peerId: number) {\n\n }\n\n public hidePinnedMessages(peerId: PeerId) {\n return Promise.all([\n appStateManager.getState(),\n this.getPinnedMessage(peerId)\n ])\n .then(([state, pinned]) => {\n state.hiddenPinnedMessages[peerId] = pinned.maxId;\n rootScope.dispatchEvent('peer_pinned_hidden', {peerId, maxId: pinned.maxId});\n });\n }\n\n public getPinnedMessage(peerId: PeerId) {\n const p = this.pinnedMessages[peerId] ?? (this.pinnedMessages[peerId] = {});\n if(p.promise) return p.promise;\n else if(p.maxId) return Promise.resolve(p);\n\n return p.promise = this.getSearch({\n peerId, \n inputFilter: {_: 'inputMessagesFilterPinned'},\n maxId: 0,\n limit: 1\n }).then(result => {\n p.count = result.count;\n p.maxId = result.history[0]?.mid;\n return p;\n }).finally(() => {\n delete p.promise;\n });\n }\n\n public updatePinnedMessage(peerId: PeerId, mid: number, unpin?: boolean, silent?: boolean, pm_oneside?: boolean) {\n return apiManager.invokeApi('messages.updatePinnedMessage', {\n peer: appPeersManager.getInputPeerById(peerId),\n unpin,\n silent,\n pm_oneside,\n id: appMessagesIdsManager.getServerMessageId(mid)\n }).then(updates => {\n //this.log('pinned updates:', updates);\n apiUpdatesManager.processUpdateMessage(updates);\n });\n }\n\n public unpinAllMessages(peerId: PeerId): Promise<boolean> {\n return apiManager.invokeApiSingle('messages.unpinAllMessages', {\n peer: appPeersManager.getInputPeerById(peerId)\n }).then(affectedHistory => {\n apiUpdatesManager.processUpdateMessage({\n _: 'updateShort',\n update: {\n _: 'updatePts',\n pts: affectedHistory.pts,\n pts_count: affectedHistory.pts_count\n }\n });\n\n if(!affectedHistory.offset) {\n const storage = this.getMessagesStorage(peerId);\n storage.forEach((message) => {\n if(message.pFlags.pinned) {\n delete message.pFlags.pinned;\n }\n });\n\n rootScope.dispatchEvent('peer_pinned_messages', {peerId, unpinAll: true});\n delete this.pinnedMessages[peerId];\n\n return true;\n }\n\n return this.unpinAllMessages(peerId);\n });\n }\n\n public getAlbumText(grouped_id: string) {\n const group = this.groupedMessagesStorage[grouped_id];\n let foundMessages = 0, message: string, totalEntities: MessageEntity[], entities: MessageEntity[];\n for(const [mid, m] of group) {\n if(m.message) {\n if(++foundMessages > 1) break;\n message = m.message;\n totalEntities = m.totalEntities;\n entities = m.entities;\n } \n }\n\n if(foundMessages > 1) {\n message = undefined;\n totalEntities = undefined;\n entities = undefined;\n }\n\n return {message, entities, totalEntities};\n }\n\n public getMidsByAlbum(grouped_id: string) {\n return getObjectKeysAndSort(this.groupedMessagesStorage[grouped_id], 'asc');\n //return Object.keys(this.groupedMessagesStorage[grouped_id]).map(id => +id).sort((a, b) => a - b);\n }\n\n public getMidsByMessage(message: Message) {\n if((message as Message.message)?.grouped_id) return this.getMidsByAlbum((message as Message.message).grouped_id);\n else return [message.mid];\n }\n\n public filterMessages(message: any, verify: (message: MyMessage) => boolean) {\n const out: MyMessage[] = [];\n if(message.grouped_id) {\n const storage = this.groupedMessagesStorage[message.grouped_id];\n for(const [mid, message] of storage) {\n if(verify(message)) {\n out.push(message);\n }\n }\n } else {\n if(verify(message)) {\n out.push(message);\n }\n }\n\n return out;\n }\n\n public generateTempMessageId(peerId: PeerId) {\n const dialog = this.getDialogOnly(peerId);\n return appMessagesIdsManager.generateMessageId(dialog?.top_message || 0, true);\n }\n\n public saveMessage(message: Message, options: Partial<{\n storage: MessagesStorage,\n isScheduled: true,\n isOutgoing: true,\n //isNew: boolean, // * new - from update\n }> = {}) {\n if(message.pFlags === undefined) {\n message.pFlags = {};\n }\n\n if(message._ === 'messageEmpty') {\n message.deleted = true;\n return;\n }\n\n // * exclude from state\n // defineNotNumerableProperties(message, ['rReply', 'mid', 'savedFrom', 'fwdFromId', 'fromId', 'peerId', 'reply_to_mid', 'viaBotId']);\n\n const peerId = this.getMessagePeer(message);\n const storage = options.storage || this.getMessagesStorage(peerId);\n const isChannel = message.peer_id._ === 'peerChannel';\n const isBroadcast = isChannel && appChatsManager.isBroadcast(peerId.toChatId());\n const isMessage = message._ === 'message';\n\n if(options.isOutgoing) {\n message.pFlags.is_outgoing = true;\n }\n \n const mid = appMessagesIdsManager.generateMessageId(message.id);\n message.mid = mid;\n\n if(isMessage) {\n if(options.isScheduled) {\n message.pFlags.is_scheduled = true;\n }\n\n if(message.grouped_id) {\n const storage = this.groupedMessagesStorage[message.grouped_id] ?? (this.groupedMessagesStorage[message.grouped_id] = new Map());\n storage.set(mid, message);\n }\n\n if(message.via_bot_id) {\n // ! WARNING\n message.viaBotId = message.via_bot_id as any;\n }\n }\n\n const dialog = this.getDialogOnly(peerId);\n if(dialog && mid) {\n if(mid > dialog[message.pFlags.out\n ? 'read_outbox_max_id'\n : 'read_inbox_max_id']) {\n message.pFlags.unread = true;\n }\n }\n // this.log(dT(), 'msg unread', mid, apiMessage.pFlags.out, dialog && dialog[apiMessage.pFlags.out ? 'read_outbox_max_id' : 'read_inbox_max_id'])\n\n if(message.reply_to) {\n if(message.reply_to.reply_to_msg_id) {\n message.reply_to.reply_to_msg_id = message.reply_to_mid = appMessagesIdsManager.generateMessageId(message.reply_to.reply_to_msg_id);\n } \n\n if(message.reply_to.reply_to_top_id) message.reply_to.reply_to_top_id = appMessagesIdsManager.generateMessageId(message.reply_to.reply_to_top_id);\n }\n\n if(isMessage && message.replies) {\n if(message.replies.max_id) message.replies.max_id = appMessagesIdsManager.generateMessageId(message.replies.max_id);\n if(message.replies.read_max_id) message.replies.read_max_id = appMessagesIdsManager.generateMessageId(message.replies.read_max_id);\n }\n\n const overwriting = !!peerId;\n if(!overwriting) {\n message.date -= serverTimeManager.serverTimeOffset;\n }\n \n //storage.generateIndex(message);\n const myId = appUsersManager.getSelf().id.toPeerId();\n\n const fwdHeader = isMessage && (message as Message.message).fwd_from as MessageFwdHeader;\n\n message.peerId = peerId;\n if(peerId === myId/* && !message.from_id && !message.fwd_from */) {\n message.fromId = fwdHeader ? (fwdHeader.from_id ? appPeersManager.getPeerId(fwdHeader.from_id) : NULL_PEER_ID) : myId;\n } else {\n //message.fromId = message.pFlags.post || (!message.pFlags.out && !message.from_id) ? peerId : appPeersManager.getPeerId(message.from_id);\n message.fromId = message.pFlags.post || !message.from_id ? peerId : appPeersManager.getPeerId(message.from_id);\n }\n\n if(fwdHeader) {\n //if(peerId === myID) {\n if(fwdHeader.saved_from_msg_id) fwdHeader.saved_from_msg_id = appMessagesIdsManager.generateMessageId(fwdHeader.saved_from_msg_id);\n if(fwdHeader.channel_post) fwdHeader.channel_post = appMessagesIdsManager.generateMessageId(fwdHeader.channel_post);\n\n const peer = fwdHeader.saved_from_peer || fwdHeader.from_id;\n const msgId = fwdHeader.saved_from_msg_id || fwdHeader.channel_post;\n if(peer && msgId) {\n const savedFromPeerId = appPeersManager.getPeerId(peer);\n const savedFromMid = appMessagesIdsManager.generateMessageId(msgId);\n message.savedFrom = savedFromPeerId + '_' + savedFromMid;\n }\n\n /* if(peerId.isAnyChat() || peerId === myID) {\n message.fromId = appPeersManager.getPeerID(!message.from_id || deepEqual(message.from_id, fwdHeader.from_id) ? fwdHeader.from_id : message.from_id);\n } */\n /* } else {\n apiMessage.fwdPostID = fwdHeader.channel_post;\n } */\n\n message.fwdFromId = appPeersManager.getPeerId(fwdHeader.from_id);\n\n if(!overwriting) {\n fwdHeader.date -= serverTimeManager.serverTimeOffset;\n }\n }\n\n const mediaContext: ReferenceContext = {\n type: 'message',\n peerId,\n messageId: mid\n };\n\n /* if(isMessage) {\n const entities = message.entities;\n if(entities && entities.find(entity => entity._ === 'messageEntitySpoiler')) {\n message.media = {_: 'messageMediaUnsupported'};\n }\n } */\n\n if(isMessage && message.media) {\n switch(message.media._) {\n case 'messageMediaEmpty': {\n delete message.media;\n break;\n }\n\n case 'messageMediaPhoto': {\n if(message.media.ttl_seconds) {\n message.media = {_: 'messageMediaUnsupported'};\n } else {\n message.media.photo = appPhotosManager.savePhoto(message.media.photo, mediaContext);\n }\n\n if(!(message.media as MessageMedia.messageMediaPhoto).photo) { // * found this bug on test DC\n delete message.media;\n }\n \n break;\n }\n \n case 'messageMediaPoll': {\n const result = appPollsManager.savePoll(message.media.poll, message.media.results, message);\n message.media.poll = result.poll;\n message.media.results = result.results;\n break;\n }\n \n case 'messageMediaDocument': {\n if(message.media.ttl_seconds) {\n message.media = {_: 'messageMediaUnsupported'};\n } else {\n message.media.document = appDocsManager.saveDoc(message.media.document, mediaContext); // 11.04.2020 warning\n }\n\n break;\n }\n \n case 'messageMediaWebPage': {\n const messageKey = appWebPagesManager.getMessageKeyForPendingWebPage(peerId, mid, options.isScheduled);\n message.media.webpage = appWebPagesManager.saveWebPage(message.media.webpage, messageKey, mediaContext);\n break;\n }\n \n /*case 'messageMediaGame':\n AppGamesManager.saveGame(apiMessage.media.game, apiMessage.mid, mediaContext);\n apiMessage.media.handleMessage = true;\n break; */\n\n case 'messageMediaInvoice': {\n message.media = {_: 'messageMediaUnsupported'};\n break;\n }\n\n case 'messageMediaUnsupported': {\n message.message = '';\n delete message.entities;\n delete message.totalEntities;\n break;\n }\n }\n }\n\n if(!isMessage && message.action) {\n const action = message.action as MessageAction;\n let migrateFrom: PeerId;\n let migrateTo: PeerId;\n const suffix = message.fromId === appUsersManager.getSelf().id ? 'You' : '';\n\n if((action as MessageAction.messageActionChatEditPhoto).photo) {\n (action as MessageAction.messageActionChatEditPhoto).photo = appPhotosManager.savePhoto((action as MessageAction.messageActionChatEditPhoto).photo, mediaContext);\n }\n\n if((action as any).document) {\n (action as any).document = appDocsManager.saveDoc((action as any).photo, mediaContext);\n }\n\n switch(action._) {\n //case 'messageActionChannelEditPhoto':\n case 'messageActionChatEditPhoto':\n // action.photo = appPhotosManager.savePhoto(action.photo, mediaContext);\n if((action.photo as Photo.photo)?.video_sizes) {\n // @ts-ignore\n action._ = isBroadcast ? 'messageActionChannelEditVideo' : 'messageActionChatEditVideo';\n } else {\n if(isBroadcast) { // ! messageActionChannelEditPhoto не существует в принципе, это используется для перевода.\n // @ts-ignore\n action._ = 'messageActionChannelEditPhoto';\n }\n }\n break;\n \n case 'messageActionGroupCall': {\n //assumeType<MessageAction.messageActionGroupCall>(action);\n\n appGroupCallsManager.saveGroupCall(action.call);\n\n let type: string;\n if(action.duration === undefined) {\n type = 'started';\n } else {\n type = 'ended'\n }\n\n if(!isBroadcast) {\n type += '_by' + suffix;\n }\n\n // @ts-ignore\n action.type = type;\n\n break;\n }\n\n case 'messageActionChatEditTitle':\n /* if(options.isNew) {\n const chat = appChatsManager.getChat(peerId.toChatId());\n chat.title = action.title;\n appChatsManager.saveApiChat(chat, true);\n } */\n \n if(isBroadcast) {\n // @ts-ignore\n action._ = 'messageActionChannelEditTitle';\n }\n break;\n\n case 'messageActionChatDeletePhoto':\n if(isBroadcast) {\n // @ts-ignore\n action._ = 'messageActionChannelDeletePhoto';\n }\n break;\n\n case 'messageActionChatAddUser':\n if(action.users.length === 1) {\n // @ts-ignore\n action.user_id = action.users[0];\n // @ts-ignore\n if(message.fromId === action.user_id) {\n if(isChannel) {\n // @ts-ignore\n action._ = 'messageActionChatJoined' + suffix;\n } else {\n // @ts-ignore\n action._ = 'messageActionChatReturn' + suffix;\n }\n }\n } else if(action.users.length > 1) {\n // @ts-ignore\n action._ = 'messageActionChatAddUsers';\n }\n break;\n\n case 'messageActionChatDeleteUser':\n if(message.fromId === action.user_id) {\n // @ts-ignore\n action._ = 'messageActionChatLeave' + suffix;\n }\n break;\n\n case 'messageActionChannelMigrateFrom':\n migrateFrom = action.chat_id.toPeerId(true);\n migrateTo = peerId;\n break\n\n case 'messageActionChatMigrateTo':\n migrateFrom = peerId;\n migrateTo = action.channel_id.toPeerId(true);\n break;\n\n case 'messageActionHistoryClear':\n //apiMessage.deleted = true;\n message.clear_history = true;\n delete message.pFlags.out;\n delete message.pFlags.unread;\n break;\n\n case 'messageActionPhoneCall':\n // @ts-ignore\n action.type = \n (action.pFlags.video ? 'video_' : '') +\n (action.duration !== undefined ? (message.pFlags.out ? 'out_' : 'in_') : '') +\n (\n action.duration !== undefined ? 'ok' : (\n action.reason._ === 'phoneCallDiscardReasonMissed'\n ? 'missed'\n : 'cancelled'\n )\n );\n break;\n }\n \n if(migrateFrom &&\n migrateTo &&\n !this.migratedFromTo[migrateFrom] &&\n !this.migratedToFrom[migrateTo]) {\n this.migrateChecks(migrateFrom, migrateTo);\n }\n }\n\n /* if(message.grouped_id) {\n if(!groups) {\n groups = new Set();\n }\n\n groups.add(message.grouped_id);\n } else {\n message.rReply = this.getRichReplyText(message);\n } */\n\n if(isMessage && message.message.length && !message.totalEntities) {\n this.wrapMessageEntities(message); \n }\n\n storage.set(mid, message);\n }\n\n public saveMessages(messages: any[], options: Partial<{\n storage: MessagesStorage,\n isScheduled: true,\n isOutgoing: true,\n //isNew: boolean, // * new - from update\n }> = {}) {\n if((messages as any).saved) return;\n (messages as any).saved = true;\n messages.forEach((message) => {\n this.saveMessage(message, options);\n });\n }\n\n private wrapMessageEntities(message: Message.message) {\n const apiEntities = message.entities ? message.entities.slice() : [];\n message.message = RichTextProcessor.fixEmoji(message.message, apiEntities);\n\n const myEntities = RichTextProcessor.parseEntities(message.message);\n message.totalEntities = RichTextProcessor.mergeEntities(apiEntities, myEntities); // ! only in this order, otherwise bold and emoji formatting won't work\n }\n\n public wrapMessageForReply(message: MyMessage | MyDraftMessage, text: string, usingMids: number[], plain: true, highlightWord?: string, withoutMediaType?: boolean): string;\n public wrapMessageForReply(message: MyMessage | MyDraftMessage, text?: string, usingMids?: number[], plain?: false, highlightWord?: string, withoutMediaType?: boolean): DocumentFragment;\n public wrapMessageForReply(message: MyMessage | MyDraftMessage, text: string = (message as Message.message).message, usingMids?: number[], plain?: boolean, highlightWord?: string, withoutMediaType?: boolean): DocumentFragment | string {\n const parts: (Node | string)[] = [];\n\n let hasAlbumKey = false;\n const addPart = (langKey: LangPackKey, part?: string | HTMLElement) => {\n if(langKey) {\n if(part === undefined && hasAlbumKey) {\n return;\n }\n \n part = plain ? I18n.format(langKey, true) : i18n(langKey);\n }\n \n if(plain) {\n parts.push(part);\n } else {\n const el = document.createElement('i');\n if(typeof(part) === 'string') el.innerHTML = part;\n else el.append(part);\n parts.push(el);\n }\n };\n\n let entities = (message as Message.message).totalEntities;\n if((message as Message.message).media) {\n assumeType<Message.message>(message);\n let usingFullAlbum = true;\n if(message.grouped_id) {\n if(usingMids) {\n const mids = this.getMidsByMessage(message);\n if(usingMids.length === mids.length) {\n for(const mid of mids) {\n if(!usingMids.includes(mid)) {\n usingFullAlbum = false;\n break;\n }\n }\n } else {\n usingFullAlbum = false;\n }\n }\n\n if(usingFullAlbum) {\n const albumText = this.getAlbumText(message.grouped_id);\n text = albumText.message;\n entities = albumText.totalEntities;\n\n if(!withoutMediaType) {\n addPart('AttachAlbum');\n hasAlbumKey = true;\n }\n }\n } else {\n usingFullAlbum = false;\n }\n\n if((!usingFullAlbum && !withoutMediaType) || !text) {\n const media = message.media;\n switch(media._) {\n case 'messageMediaPhoto':\n addPart('AttachPhoto');\n break;\n case 'messageMediaDice':\n addPart(undefined, plain ? media.emoticon : RichTextProcessor.wrapEmojiText(media.emoticon));\n break;\n case 'messageMediaVenue': {\n text = media.title;\n addPart('AttachLocation');\n break;\n }\n case 'messageMediaGeo':\n addPart('AttachLocation');\n break;\n case 'messageMediaGeoLive':\n addPart('AttachLiveLocation');\n break;\n case 'messageMediaPoll':\n addPart(undefined, plain ? '📊' + ' ' + (media.poll.question || 'poll') : media.poll.rReply);\n break;\n case 'messageMediaContact':\n addPart('AttachContact');\n break;\n case 'messageMediaGame': {\n const f = '🎮' + ' ' + media.game.title;\n addPart(undefined, plain ? f : RichTextProcessor.wrapEmojiText(f));\n break;\n }\n case 'messageMediaDocument': {\n const document = media.document as MyDocument;\n \n if(document.type === 'video') {\n addPart('AttachVideo');\n } else if(document.type === 'voice') {\n addPart('AttachAudio');\n } else if(document.type === 'gif') {\n addPart('AttachGif');\n } else if(document.type === 'round') {\n addPart('AttachRound');\n } else if(document.type === 'sticker') {\n if(document.stickerEmojiRaw) {\n addPart(undefined, (plain ? document.stickerEmojiRaw : document.stickerEmoji) + ' ');\n }\n \n addPart('AttachSticker');\n text = '';\n } else if(document.type === 'audio') {\n const attribute = document.attributes.find(attribute => attribute._ === 'documentAttributeAudio' && (attribute.title || attribute.performer)) as DocumentAttribute.documentAttributeAudio;\n const f = '🎵' + ' ' + (attribute ? [attribute.title, attribute.performer].filter(Boolean).join(' - ') : document.file_name);\n addPart(undefined, plain ? f : RichTextProcessor.wrapEmojiText(f));\n } else {\n addPart(undefined, plain ? document.file_name : RichTextProcessor.wrapEmojiText(document.file_name));\n }\n \n break;\n }\n\n case 'messageMediaUnsupported': {\n addPart(UNSUPPORTED_LANG_PACK_KEY);\n break;\n }\n \n default:\n //messageText += media._;\n ///////this.log.warn('Got unknown media type!', message);\n break;\n }\n }\n\n const length = parts.length;\n /* for(let i = 1; i < length; i += 2) {\n parts.splice(i, 0, ', ');\n } */\n\n if(text && length) {\n parts.push(', ');\n }\n }\n\n if((message as Message.messageService).action) {\n const actionWrapped = this.wrapMessageActionTextNew((message as Message.messageService), plain);\n if(actionWrapped) {\n addPart(undefined, actionWrapped);\n }\n }\n\n if(text) {\n text = limitSymbols(text, 100);\n\n if(!entities) {\n entities = [];\n }\n\n if(plain) {\n parts.push(RichTextProcessor.wrapPlainText(text, entities));\n } else {\n // let entities = RichTextProcessor.parseEntities(text.replace(/\\n/g, ' '));\n\n if(highlightWord) {\n highlightWord = highlightWord.trim();\n let found = false;\n let match: any;\n let regExp = new RegExp(escapeRegExp(highlightWord), 'gi');\n while((match = regExp.exec(text)) !== null) {\n entities.push({_: 'messageEntityHighlight', length: highlightWord.length, offset: match.index});\n found = true;\n }\n \n if(found) {\n RichTextProcessor.sortEntities(entities);\n }\n }\n\n const messageWrapped = RichTextProcessor.wrapRichText(text, {\n noLinebreaks: true, \n entities, \n noLinks: true,\n noTextFormat: true\n });\n \n parts.push(htmlToDocumentFragment(messageWrapped) as any);\n }\n }\n\n if(plain) {\n return parts.join('');\n } else {\n const fragment = document.createDocumentFragment();\n fragment.append(...parts);\n return fragment;\n }\n }\n\n public wrapSenderToPeer(message: MyMessage) {\n const senderTitle: HTMLElement = document.createElement('span');\n senderTitle.classList.add('sender-title');\n \n const fromMe = message.fromId === rootScope.myId && message.peerId !== rootScope.myId;\n senderTitle.append(\n fromMe ? \n i18n('FromYou') : \n new PeerTitle({\n ...this.getMessageSenderPeerIdOrName(message),\n dialog: message.peerId === rootScope.myId\n }).element\n );\n\n if(appPeersManager.isAnyGroup(message.peerId) || fromMe) {\n const peerTitle = new PeerTitle({peerId: message.peerId}).element;\n senderTitle.append(' ➝ ', peerTitle);\n }\n\n return senderTitle;\n }\n\n public getMessageSenderPeerIdOrName(message: MyMessage) {\n if(message.fromId) {\n return {\n peerId: message.fromId\n };\n } else {\n return {\n fromName: (message as Message.message).fwd_from?.from_name\n };\n }\n }\n\n public wrapSentTime(message: MyMessage) {\n const el: HTMLElement = document.createElement('span');\n el.classList.add('sent-time');\n el.append(formatDateAccordingToTodayNew(new Date(message.date * 1000)));\n\n return el;\n }\n\n private wrapJoinVoiceChatAnchor(message: Message.messageService) {\n const action = message.action as MessageAction.messageActionInviteToGroupCall;\n const {onclick, url} = RichTextProcessor.wrapUrl(`tg://voicechat?chat_id=${message.peerId.toChatId()}&id=${action.call.id}&access_hash=${action.call.access_hash}`);\n if(!onclick) {\n return document.createElement('span');\n }\n \n const a = document.createElement('a');\n a.href = url;\n a.setAttribute('onclick', onclick + '(this)');\n\n return a;\n }\n\n private wrapMessageActionTextNewUnsafe(message: MyMessage, plain?: boolean) {\n const element: HTMLElement = plain ? undefined : document.createElement('span');\n const action = 'action' in message && message.action;\n\n // this.log('message action:', action);\n\n if((action as MessageAction.messageActionCustomAction).message) {\n const unsafeMessage = (action as MessageAction.messageActionCustomAction).message;\n if(plain) {\n return RichTextProcessor.wrapPlainText(unsafeMessage);\n } else {\n element.innerHTML = RichTextProcessor.wrapRichText(unsafeMessage, {noLinebreaks: true});\n return element;\n }\n } else {\n let _ = action._;\n //let suffix = '';\n let langPackKey: LangPackKey;\n let args: any[];\n\n const getNameDivHTML = (peerId: PeerId, plain: boolean) => {\n return plain ? appPeersManager.getPeerTitle(peerId, plain) : (new PeerTitle({peerId})).element;\n };\n\n switch(action._) {\n case 'messageActionPhoneCall': {\n _ += '.' + (action as any).type;\n\n args = [formatCallDuration(action.duration, plain)];\n break;\n }\n\n case 'messageActionGroupCall': {\n _ += '.' + (action as any).type;\n\n args = [];\n if(!_.endsWith('You') && !message.pFlags.post) {\n args.push(getNameDivHTML(message.fromId, plain));\n }\n\n if(action.duration !== undefined) {\n args.push(formatCallDuration(action.duration, plain));\n } else {\n args.push(this.wrapJoinVoiceChatAnchor(message as any));\n }\n\n break;\n }\n\n case 'messageActionInviteToGroupCall': {\n const peerIds = [message.fromId, action.users[0].toPeerId()];\n let a = 'Chat.Service.VoiceChatInvitation';\n const myId = appUsersManager.getSelf().id;\n if(peerIds[0] === myId) a += 'ByYou';\n else if(peerIds[1] === myId) a += 'ForYou';\n indexOfAndSplice(peerIds, myId);\n\n langPackKey = a as LangPackKey;\n args = peerIds.map(peerId => getNameDivHTML(peerId, plain));\n args.push(this.wrapJoinVoiceChatAnchor(message as any));\n break;\n }\n\n case 'messageActionGroupCallScheduled': {\n const today = new Date();\n const date = new Date(action.schedule_date * 1000);\n const daysToStart = (date.getTime() - today.getTime()) / 86400e3;\n const tomorrowDate = new Date(today);\n tomorrowDate.setDate(tomorrowDate.getDate() + 1);\n\n const isBroadcast = appPeersManager.isBroadcast(message.peerId);\n langPackKey = isBroadcast ? 'ChatList.Service.VoiceChatScheduled.Channel' : 'ChatList.Service.VoiceChatScheduled';\n args = [];\n const myId = appUsersManager.getSelf().id;\n if(message.fromId === myId) {\n langPackKey += 'You';\n } else if(!isBroadcast) {\n args.push(getNameDivHTML(message.fromId, plain));\n }\n\n let k: LangPackKey, _args: FormatterArguments = [];\n if(daysToStart < 1 && date.getDate() === today.getDate()) {\n k = 'TodayAtFormattedWithToday';\n } else if(daysToStart < 2 && date.getDate() === tomorrowDate.getDate()) {\n k = 'Time.TomorrowAt';\n } else {\n k = 'formatDateAtTime';\n _args.push(new I18n.IntlDateElement({\n date, \n options: {\n day: '2-digit',\n month: '2-digit',\n year: '2-digit'\n }\n }).element);\n }\n\n _args.push(formatTime(date));\n const t = i18n(k, _args);\n args.push(t);\n\n break;\n }\n\n case 'messageActionChatCreate': {\n const myId = appUsersManager.getSelf().id;\n if(message.fromId === myId) {\n _ += 'You';\n } else {\n args = [getNameDivHTML(message.fromId, plain)];\n }\n \n break;\n }\n\n case 'messageActionPinMessage': {\n const peerId = message.peerId;\n const pinnedMessage = this.getMessageByPeer(peerId, message.reply_to_mid);\n\n args = [\n getNameDivHTML(message.fromId, plain),\n ];\n \n if(pinnedMessage.deleted/* || true */) {\n langPackKey = 'ActionPinnedNoText';\n\n if(message.reply_to_mid) { // refresh original message\n this.fetchMessageReplyTo(message).then(originalMessage => {\n if(!originalMessage.deleted && !message.deleted) {\n rootScope.dispatchEvent('message_edit', {\n storage: this.getMessagesStorage(peerId),\n peerId: peerId,\n mid: message.mid\n });\n\n if(this.isMessageIsTopMessage(message)) {\n rootScope.dispatchEvent('dialogs_multiupdate', {\n [peerId]: this.getDialogOnly(peerId)\n });\n }\n }\n });\n }\n } else {\n const a = document.createElement('i');\n a.dataset.savedFrom = pinnedMessage.peerId + '_' + pinnedMessage.mid;\n a.dir = 'auto';\n a.append(this.wrapMessageForReply(pinnedMessage, undefined, undefined, plain as any));\n args.push(a);\n }\n\n break;\n }\n\n case 'messageActionChatJoinedByRequest': {\n const isBroadcast = appPeersManager.isBroadcast(message.peerId);\n if(message.pFlags.out) {\n langPackKey = isBroadcast ? 'RequestToJoinChannelApproved' : 'RequestToJoinGroupApproved';\n } else {\n langPackKey = isBroadcast ? 'ChatService.UserJoinedChannelByRequest' : 'ChatService.UserJoinedGroupByRequest';\n args = [getNameDivHTML(message.fromId, plain)];\n }\n break;\n }\n\n case 'messageActionContactSignUp':\n case 'messageActionChatReturn':\n case 'messageActionChatLeave':\n case 'messageActionChatJoined':\n case 'messageActionChatEditPhoto':\n case 'messageActionChatDeletePhoto':\n case 'messageActionChatEditVideo':\n case 'messageActionChatJoinedByLink':\n case 'messageActionChannelEditVideo':\n case 'messageActionChannelDeletePhoto': {\n args = [getNameDivHTML(message.fromId, plain)];\n break;\n }\n\n case 'messageActionChannelEditTitle':\n case 'messageActionChatEditTitle': {\n args = [];\n if(action._ === 'messageActionChatEditTitle') {\n args.push(getNameDivHTML(message.fromId, plain));\n }\n\n args.push(plain ? action.title : htmlToSpan(RichTextProcessor.wrapEmojiText(action.title)));\n break;\n }\n\n case 'messageActionChatDeleteUser':\n case 'messageActionChatAddUsers':\n case 'messageActionChatAddUser': {\n const users = (action as MessageAction.messageActionChatAddUser).users \n || [(action as MessageAction.messageActionChatDeleteUser).user_id];\n\n args = [getNameDivHTML(message.fromId, plain)];\n\n if(users.length > 1) {\n const joined = join(\n users.map((userId: UserId) => getNameDivHTML(userId.toPeerId(), plain)),\n false,\n plain\n );\n \n if(plain) {\n args.push(...joined);\n } else {\n const fragment = document.createElement('span');\n fragment.append(...joined);\n args.push(fragment);\n }\n } else {\n args.push(getNameDivHTML(users[0].toPeerId(), plain));\n }\n\n break;\n }\n\n case 'messageActionBotAllowed': {\n const anchorHTML = RichTextProcessor.wrapRichText(action.domain, {\n entities: [{\n _: 'messageEntityUrl',\n length: action.domain.length,\n offset: 0\n }]\n });\n\n const node = htmlToSpan(anchorHTML);\n\n args = [node];\n break;\n }\n\n default:\n langPackKey = (langPack[_] || `[${action._}]`) as any;\n break;\n }\n\n if(!langPackKey) {\n langPackKey = langPack[_];\n if(langPackKey === undefined) {\n langPackKey = '[' + _ + ']' as any;\n }\n }\n\n if(plain) {\n return I18n.format(langPackKey, true, args);\n } else {\n return _i18n(element, langPackKey, args);\n }\n\n //str = !langPackKey || langPackKey[0].toUpperCase() === langPackKey[0] ? langPackKey : getNameDivHTML(message.fromId) + langPackKey + (suffix ? ' ' : '');\n }\n }\n\n public wrapMessageActionTextNew(message: MyMessage, plain: true): string;\n public wrapMessageActionTextNew(message: MyMessage, plain?: false): HTMLElement;\n public wrapMessageActionTextNew(message: MyMessage, plain: boolean): HTMLElement | string;\n public wrapMessageActionTextNew(message: MyMessage, plain?: boolean): HTMLElement | string {\n try {\n return this.wrapMessageActionTextNewUnsafe(message, plain);\n } catch(err) {\n this.log.error('wrapMessageActionTextNewUnsafe error:', err);\n return plain ? '' : document.createElement('span');\n }\n }\n\n public reportMessages(peerId: PeerId, mids: number[], reason: ReportReason['_'], message?: string) {\n return apiManager.invokeApiSingle('messages.report', {\n peer: appPeersManager.getInputPeerById(peerId),\n id: mids.map(mid => appMessagesIdsManager.getServerMessageId(mid)),\n reason: {\n _: reason\n },\n message\n });\n }\n\n public startBot(botId: BotId, chatId?: ChatId, startParam?: string) {\n const peerId = chatId ? chatId.toPeerId(true) : botId.toPeerId();\n if(startParam) {\n const randomId = randomLong();\n\n return apiManager.invokeApi('messages.startBot', {\n bot: appUsersManager.getUserInput(botId),\n peer: appPeersManager.getInputPeerById(peerId),\n random_id: randomId,\n start_param: startParam\n }).then((updates) => {\n apiUpdatesManager.processUpdateMessage(updates);\n });\n }\n\n const str = '/start';\n if(chatId) {\n let promise: Promise<void>;\n if(appChatsManager.isChannel(chatId)) {\n promise = appChatsManager.inviteToChannel(chatId, [botId]);\n } else {\n promise = appChatsManager.addChatUser(chatId, botId, 0);\n }\n\n return promise.catch((error) => {\n if(error && error.type == 'USER_ALREADY_PARTICIPANT') {\n error.handled = true;\n return;\n }\n\n throw error;\n }).then(() => {\n const bot = appUsersManager.getUser(botId);\n return this.sendText(peerId, str + '@' + bot.username);\n });\n }\n\n return this.sendText(peerId, str);\n }\n\n public editPeerFolders(peerIds: PeerId[], folderId: number) {\n apiManager.invokeApi('folders.editPeerFolders', {\n folder_peers: peerIds.map(peerId => {\n return {\n _: 'inputFolderPeer',\n peer: appPeersManager.getInputPeerById(peerId),\n folder_id: folderId\n };\n })\n }).then(updates => {\n //this.log('editPeerFolders updates:', updates);\n apiUpdatesManager.processUpdateMessage(updates); // WARNING! возможно тут нужно добавлять channelId, и вызывать апдейт для каждого канала отдельно\n });\n }\n\n public toggleDialogPin(peerId: PeerId, filterId?: number) {\n if(filterId > 1) {\n return this.filtersStorage.toggleDialogPin(peerId, filterId);\n }\n\n const dialog = this.getDialogOnly(peerId);\n if(!dialog) return Promise.reject();\n\n const pinned = dialog.pFlags?.pinned ? undefined : true;\n\n if(pinned) {\n const max = filterId === 1 ? rootScope.config.pinned_infolder_count_max : rootScope.config.pinned_dialogs_count_max;\n if(this.dialogsStorage.getPinnedOrders(filterId).length >= max) {\n return Promise.reject({type: 'PINNED_DIALOGS_TOO_MUCH'});\n }\n }\n\n return apiManager.invokeApi('messages.toggleDialogPin', {\n peer: appPeersManager.getInputDialogPeerById(peerId),\n pinned\n }).then(bool => {\n if(bool) {\n const pFlags: Update.updateDialogPinned['pFlags'] = pinned ? {pinned} : {};\n apiUpdatesManager.saveUpdate({\n _: 'updateDialogPinned',\n peer: appPeersManager.getDialogPeer(peerId),\n folder_id: filterId,\n pFlags\n });\n }\n });\n }\n\n public markDialogUnread(peerId: PeerId, read?: true) {\n const dialog = this.getDialogOnly(peerId);\n if(!dialog) return Promise.reject();\n\n const unread = read || dialog.pFlags?.unread_mark ? undefined : true;\n return apiManager.invokeApi('messages.markDialogUnread', {\n peer: appPeersManager.getInputDialogPeerById(peerId),\n unread\n }).then(bool => {\n if(bool) {\n const pFlags: Update.updateDialogUnreadMark['pFlags'] = unread ? {unread} : {};\n this.onUpdateDialogUnreadMark({\n _: 'updateDialogUnreadMark',\n peer: appPeersManager.getDialogPeer(peerId),\n pFlags\n });\n }\n });\n }\n\n public migrateChecks(migrateFrom: PeerId, migrateTo: PeerId) {\n if(!this.migratedFromTo[migrateFrom] &&\n !this.migratedToFrom[migrateTo] &&\n appChatsManager.hasChat(migrateTo.toChatId())) {\n const fromChat = appChatsManager.getChat(migrateFrom.toChatId());\n if(fromChat &&\n fromChat.migrated_to &&\n fromChat.migrated_to.channel_id === migrateTo.toChatId()) {\n this.migratedFromTo[migrateFrom] = migrateTo;\n this.migratedToFrom[migrateTo] = migrateFrom;\n\n //setTimeout(() => {\n rootScope.dispatchEvent('dialog_migrate', {migrateFrom, migrateTo});\n\n this.dialogsStorage.dropDialogWithEvent(migrateFrom);\n //}, 100);\n }\n }\n }\n\n private canMessageBeEdited(message: any, kind: 'text' | 'poll') {\n if(message.pFlags.is_outgoing) {\n return false;\n }\n\n const goodMedias = [\n 'messageMediaPhoto',\n 'messageMediaDocument',\n 'messageMediaWebPage'\n ];\n\n if(kind === 'poll') {\n goodMedias.push('messageMediaPoll');\n }\n\n if(message._ !== 'message' ||\n message.deleted ||\n message.fwd_from ||\n message.via_bot_id ||\n message.media && goodMedias.indexOf(message.media._) === -1 ||\n message.fromId && appUsersManager.isBot(message.fromId)) {\n return false;\n }\n \n if(message.media &&\n message.media._ === 'messageMediaDocument' &&\n (message.media.document.sticker || message.media.document.type === 'round')) {\n return false;\n }\n\n return true;\n }\n\n public canEditMessage(message: Message.message | Message.messageService, kind: 'text' | 'poll' = 'text') {\n if(!message || !this.canMessageBeEdited(message, kind)) {\n return false;\n }\n\n // * second rule for saved messages, because there is no 'out' flag\n if(/* message.pFlags.out || */this.getMessagePeer(message) === appUsersManager.getSelf().id) {\n return true;\n }\n\n if(!message.pFlags.out || (\n message.peerId.isUser() && \n message.date < (tsNow(true) - rootScope.config.edit_time_limit) && \n (message as Message.message).media?._ !== 'messageMediaPoll'\n )\n ) {\n return false;\n }\n\n return true;\n }\n\n public canDeleteMessage(message: MyMessage) {\n return message && (\n message.peerId.isUser() \n || message.fromId === rootScope.myId \n || appChatsManager.getChat(message.peerId.toChatId())._ === 'chat' \n || appChatsManager.hasRights(message.peerId.toChatId(), 'delete_messages')\n ) && !message.pFlags.is_outgoing;\n }\n\n public getReplyKeyboard(peerId: PeerId) {\n return this.getHistoryStorage(peerId).replyMarkup;\n }\n\n public mergeReplyKeyboard(historyStorage: HistoryStorage, message: Message.messageService | Message.message) {\n // this.log('merge', message.mid, message.reply_markup, historyStorage.reply_markup)\n let messageReplyMarkup = (message as Message.message).reply_markup;\n if(!messageReplyMarkup &&\n !message.pFlags?.out &&\n !(message as Message.messageService).action) {\n return false;\n }\n\n if(messageReplyMarkup?._ === 'replyInlineMarkup') {\n return false;\n }\n\n const lastReplyMarkup = historyStorage.replyMarkup;\n if(messageReplyMarkup) {\n if(lastReplyMarkup && lastReplyMarkup.mid >= message.mid) {\n return false;\n }\n\n if(messageReplyMarkup.pFlags.selective) {\n return false;\n }\n\n if(historyStorage.maxOutId &&\n message.mid < historyStorage.maxOutId &&\n (messageReplyMarkup as ReplyMarkup.replyKeyboardMarkup | ReplyMarkup.replyKeyboardForceReply).pFlags.single_use) {\n (messageReplyMarkup as ReplyMarkup.replyKeyboardMarkup | ReplyMarkup.replyKeyboardForceReply).pFlags.hidden = true;\n }\n\n messageReplyMarkup.mid = message.mid;\n /* messageReplyMarkup = Object.assign({\n mid: message.mid\n }, messageReplyMarkup); */\n\n if(messageReplyMarkup._ !== 'replyKeyboardHide') {\n messageReplyMarkup.fromId = appPeersManager.getPeerId(message.from_id);\n }\n\n historyStorage.replyMarkup = messageReplyMarkup;\n // this.log('set', historyStorage.reply_markup)\n return true;\n }\n\n if(message.pFlags.out) {\n if(lastReplyMarkup) {\n assumeType<ReplyMarkup.replyKeyboardMarkup>(lastReplyMarkup);\n if(lastReplyMarkup.pFlags.single_use &&\n !lastReplyMarkup.pFlags.hidden &&\n (message.mid > lastReplyMarkup.mid || message.pFlags.is_outgoing) &&\n (message as Message.message).message) {\n lastReplyMarkup.pFlags.hidden = true;\n // this.log('set', historyStorage.reply_markup)\n return true;\n }\n } else if(!historyStorage.maxOutId ||\n message.mid > historyStorage.maxOutId) {\n historyStorage.maxOutId = message.mid;\n }\n }\n\n assumeType<Message.messageService>(message);\n if(message.action?._ === 'messageActionChatDeleteUser' &&\n (lastReplyMarkup\n ? message.action.user_id === (lastReplyMarkup as ReplyMarkup.replyKeyboardMarkup).fromId\n : appUsersManager.isBot(message.action.user_id)\n )\n ) {\n historyStorage.replyMarkup = {\n _: 'replyKeyboardHide',\n mid: message.mid,\n pFlags: {}\n };\n // this.log('set', historyStorage.reply_markup)\n return true;\n }\n\n return false;\n }\n\n public getSearchStorage(peerId: PeerId, inputFilter: MyInputMessagesFilter) {\n if(!this.searchesStorage[peerId]) this.searchesStorage[peerId] = {};\n if(!this.searchesStorage[peerId][inputFilter]) this.searchesStorage[peerId][inputFilter] = {history: []};\n return this.searchesStorage[peerId][inputFilter];\n }\n\n public getSearchCounters(peerId: PeerId, filters: MessagesFilter[], canCache = true) {\n const func = (canCache ? apiManager.invokeApiCacheable : apiManager.invokeApi).bind(apiManager);\n return func('messages.getSearchCounters', {\n peer: appPeersManager.getInputPeerById(peerId),\n filters\n });\n }\n\n public filterMessagesByInputFilter(inputFilter: MyInputMessagesFilter, history: number[], storage: MessagesStorage, limit: number) {\n const foundMsgs: MyMessage[] = [];\n if(!history.length) {\n return foundMsgs;\n }\n\n let filtering = true;\n const neededContents: Partial<{\n [messageMediaType in MessageMedia['_']]: boolean\n }> & Partial<{\n avatar: boolean,\n url: boolean\n }> = {},\n neededDocTypes: MyDocument['type'][] = [], \n excludeDocTypes: MyDocument['type'][] = []/* ,\n neededFlags: string[] = [] */;\n\n switch(inputFilter) {\n case 'inputMessagesFilterPhotos':\n neededContents['messageMediaPhoto'] = true;\n break;\n\n case 'inputMessagesFilterPhotoVideo':\n neededContents['messageMediaPhoto'] = true;\n neededContents['messageMediaDocument'] = true;\n neededDocTypes.push('video');\n break;\n\n case 'inputMessagesFilterVideo':\n neededContents['messageMediaDocument'] = true;\n neededDocTypes.push('video');\n break;\n\n case 'inputMessagesFilterDocument':\n neededContents['messageMediaDocument'] = true;\n excludeDocTypes.push('video');\n break;\n\n case 'inputMessagesFilterVoice':\n neededContents['messageMediaDocument'] = true;\n neededDocTypes.push('voice');\n break;\n\n case 'inputMessagesFilterRoundVoice':\n neededContents['messageMediaDocument'] = true;\n neededDocTypes.push('round', 'voice');\n break;\n\n case 'inputMessagesFilterRoundVideo':\n neededContents['messageMediaDocument'] = true;\n neededDocTypes.push('round');\n break;\n\n case 'inputMessagesFilterMusic':\n neededContents['messageMediaDocument'] = true;\n neededDocTypes.push('audio');\n break;\n\n case 'inputMessagesFilterUrl':\n neededContents['url'] = true;\n break;\n\n case 'inputMessagesFilterChatPhotos':\n neededContents['avatar'] = true;\n break;\n\n /* case 'inputMessagesFilterPinned':\n neededFlags.push('pinned');\n break; */\n\n /* case 'inputMessagesFilterMyMentions':\n neededContents['mentioned'] = true;\n break; */\n\n default:\n filtering = false;\n break;\n /* return Promise.resolve({\n count: 0,\n next_rate: 0,\n history: [] as number[]\n }); */\n }\n\n if(!filtering) {\n return foundMsgs;\n }\n\n for(let i = 0, length = history.length; i < length; ++i) {\n const message: Message.message | Message.messageService = storage.get(history[i]);\n if(!message) continue;\n \n //|| (neededContents['mentioned'] && message.totalEntities.find((e: any) => e._ === 'messageEntityMention'));\n \n let found = false;\n if(message._ === 'message') {\n if(message.media && neededContents[message.media._]/* && !message.fwd_from */) {\n const doc = (message.media as MessageMedia.messageMediaDocument).document as MyDocument;\n if(doc && ((neededDocTypes.length && !neededDocTypes.includes(doc.type)) \n || excludeDocTypes.includes(doc.type))) {\n continue;\n }\n \n found = true;\n } else if(neededContents['url'] && message.message) {\n const goodEntities = ['messageEntityTextUrl', 'messageEntityUrl'];\n if((message.totalEntities as MessageEntity[]).find(e => goodEntities.includes(e._)) || RichTextProcessor.matchUrl(message.message)) {\n found = true;\n }\n }\n } else if(neededContents['avatar'] && \n message.action && \n ([\n 'messageActionChannelEditPhoto' as const, \n 'messageActionChatEditPhoto' as const, \n 'messageActionChannelEditVideo' as const, \n 'messageActionChatEditVideo' as const\n ] as MessageAction['_'][]).includes(message.action._)) {\n found = true;\n }/* else if(neededFlags.find(flag => message.pFlags[flag])) {\n found = true;\n } */\n \n if(found) {\n foundMsgs.push(message);\n if(foundMsgs.length >= limit) {\n break;\n }\n }\n }\n\n return foundMsgs;\n }\n\n public getSearch({peerId, query, inputFilter, maxId, limit, nextRate, backLimit, threadId, folderId, minDate, maxDate}: {\n peerId?: PeerId,\n maxId?: number,\n limit?: number,\n nextRate?: number,\n backLimit?: number,\n threadId?: number,\n folderId?: number,\n query?: string,\n inputFilter?: {\n _: MyInputMessagesFilter\n },\n minDate?: number,\n maxDate?: number\n }): Promise<{\n count: number,\n next_rate: number,\n offset_id_offset: number,\n history: MyMessage[]\n }> {\n if(!query) query = '';\n if(!inputFilter) inputFilter = {_: 'inputMessagesFilterEmpty'};\n if(limit === undefined) limit = 20;\n if(!nextRate) nextRate = 0;\n if(!backLimit) backLimit = 0;\n\n minDate = minDate ? minDate / 1000 | 0 : 0;\n maxDate = maxDate ? maxDate / 1000 | 0 : 0;\n\n let foundMsgs: MyMessage[] = [];\n\n //this.log('search', maxId);\n\n if(backLimit) {\n limit += backLimit;\n }\n\n //const beta = inputFilter._ === 'inputMessagesFilterPinned' && !backLimit;\n const beta = false;\n\n let storage: {\n count?: number;\n history: SlicedArray;\n };\n\n // * костыль для limit 1, если нужно и получить сообщение, и узнать количество сообщений\n if(peerId && !backLimit && !maxId && !query && limit !== 1 && !threadId/* && inputFilter._ !== 'inputMessagesFilterPinned' */) {\n storage = beta ? \n this.getSearchStorage(peerId, inputFilter._) as any : \n this.getHistoryStorage(peerId);\n foundMsgs = this.filterMessagesByInputFilter(inputFilter._, storage.history.slice, this.getMessagesStorage(peerId), limit);\n }\n\n if(foundMsgs.length) {\n if(foundMsgs.length < limit && (beta ? storage.count !== storage.history.length : true)) {\n maxId = foundMsgs[foundMsgs.length - 1].mid;\n limit = limit - foundMsgs.length;\n } else {\n return Promise.resolve({\n count: beta ? storage.count : 0,\n next_rate: 0,\n offset_id_offset: 0,\n history: foundMsgs\n });\n }\n } else if(beta && storage?.count) {\n return Promise.resolve({\n count: storage.count,\n next_rate: 0,\n offset_id_offset: 0,\n history: []\n });\n }\n\n const canCache = false && (['inputMessagesFilterChatPhotos', 'inputMessagesFilterPinned'] as MyInputMessagesFilter[]).includes(inputFilter._);\n const method = (canCache ? apiManager.invokeApiCacheable : apiManager.invokeApi).bind(apiManager);\n\n let apiPromise: Promise<any>;\n if(peerId && !nextRate && folderId === undefined/* || !query */) {\n apiPromise = method('messages.search', {\n peer: appPeersManager.getInputPeerById(peerId),\n q: query || '',\n filter: inputFilter as any as MessagesFilter,\n min_date: minDate,\n max_date: maxDate,\n limit,\n offset_id: appMessagesIdsManager.getServerMessageId(maxId) || 0,\n add_offset: backLimit ? -backLimit : 0,\n max_id: 0,\n min_id: 0,\n hash: '',\n top_msg_id: appMessagesIdsManager.getServerMessageId(threadId) || 0\n }, {\n //timeout: APITIMEOUT,\n noErrorBox: true\n });\n } else {\n //var offsetDate = 0;\n let offsetPeerId: PeerId;\n let offsetId = 0;\n let offsetMessage = maxId && this.getMessageByPeer(peerId, maxId);\n\n if(offsetMessage && offsetMessage.date) {\n //offsetDate = offsetMessage.date + serverTimeManager.serverTimeOffset;\n offsetId = offsetMessage.id;\n offsetPeerId = this.getMessagePeer(offsetMessage);\n }\n\n apiPromise = method('messages.searchGlobal', {\n q: query,\n filter: inputFilter as any as MessagesFilter,\n min_date: minDate,\n max_date: maxDate,\n offset_rate: nextRate,\n offset_peer: appPeersManager.getInputPeerById(offsetPeerId),\n offset_id: offsetId,\n limit,\n folder_id: folderId\n }, {\n //timeout: APITIMEOUT,\n noErrorBox: true\n });\n }\n\n return apiPromise.then((searchResult: any) => {\n appUsersManager.saveApiUsers(searchResult.users);\n appChatsManager.saveApiChats(searchResult.chats);\n this.saveMessages(searchResult.messages);\n\n /* if(beta && storage && (!maxId || storage.history[storage.history.length - 1] === maxId)) {\n const storage = this.getSearchStorage(peerId, inputFilter._);\n const add = (searchResult.messages.map((m: any) => m.mid) as number[]).filter(mid => storage.history.indexOf(mid) === -1);\n storage.history.push(...add);\n storage.history.sort((a, b) => b - a);\n storage.count = searchResult.count;\n } */\n\n if(DEBUG) {\n this.log('getSearch result:', inputFilter, searchResult);\n }\n\n const foundCount: number = searchResult.count || (foundMsgs.length + searchResult.messages.length);\n\n searchResult.messages.forEach((message: MyMessage) => {\n const peerId = this.getMessagePeer(message);\n if(peerId.isAnyChat()) {\n const chat: Chat.chat = appChatsManager.getChat(peerId.toChatId());\n if(chat.migrated_to) {\n this.migrateChecks(peerId, (chat.migrated_to as InputChannel.inputChannel).channel_id.toPeerId(true));\n }\n }\n\n foundMsgs.push(message);\n });\n\n return {\n count: foundCount,\n offset_id_offset: searchResult.offset_id_offset || 0,\n next_rate: searchResult.next_rate,\n history: foundMsgs\n };\n });\n }\n\n public subscribeRepliesThread(peerId: PeerId, mid: number) {\n const repliesKey = peerId + '_' + mid;\n for(const threadKey in this.threadsToReplies) {\n if(this.threadsToReplies[threadKey] === repliesKey) return;\n }\n\n this.getDiscussionMessage(peerId, mid);\n }\n\n public generateThreadServiceStartMessage(message: Message.message | Message.messageService) {\n const threadKey = message.peerId + '_' + message.mid;\n if(this.threadsServiceMessagesIdsStorage[threadKey]) return;\n\n const maxMessageId = appMessagesIdsManager.getServerMessageId(Math.max(...this.getMidsByMessage(message)));\n const serviceStartMessage: Message.messageService = {\n _: 'messageService',\n pFlags: {\n is_single: true\n },\n id: appMessagesIdsManager.generateMessageId(maxMessageId, true),\n date: message.date,\n from_id: {_: 'peerUser', user_id: NULL_PEER_ID}/* message.from_id */,\n peer_id: message.peer_id,\n action: {\n _: 'messageActionDiscussionStarted'\n },\n reply_to: this.generateReplyHeader(message.id)\n };\n\n this.saveMessages([serviceStartMessage], {isOutgoing: true});\n this.threadsServiceMessagesIdsStorage[threadKey] = serviceStartMessage.mid;\n } \n\n public getDiscussionMessage(peerId: PeerId, mid: number) {\n return apiManager.invokeApiSingle('messages.getDiscussionMessage', {\n peer: appPeersManager.getInputPeerById(peerId),\n msg_id: appMessagesIdsManager.getServerMessageId(mid)\n }).then(result => {\n appChatsManager.saveApiChats(result.chats);\n appUsersManager.saveApiUsers(result.users);\n this.saveMessages(result.messages);\n\n const message = this.filterMessages(result.messages[0], message => !!(message as Message.message).replies)[0] as Message.message;\n const threadKey = message.peerId + '_' + message.mid;\n\n this.generateThreadServiceStartMessage(message);\n \n const historyStorage = this.getHistoryStorage(message.peerId, message.mid);\n result.max_id = historyStorage.maxId = appMessagesIdsManager.generateMessageId(result.max_id) || 0;\n result.read_inbox_max_id = historyStorage.readMaxId = appMessagesIdsManager.generateMessageId(result.read_inbox_max_id ?? message.mid);\n result.read_outbox_max_id = historyStorage.readOutboxMaxId = appMessagesIdsManager.generateMessageId(result.read_outbox_max_id) || 0;\n\n this.threadsToReplies[threadKey] = peerId + '_' + mid;\n\n return message;\n });\n }\n\n private handleNewMessage(peerId: PeerId, mid: number) {\n if(this.newMessagesToHandle[peerId] === undefined) {\n this.newMessagesToHandle[peerId] = new Set();\n }\n\n this.newMessagesToHandle[peerId].add(mid);\n if(!this.newMessagesHandleTimeout) {\n this.newMessagesHandleTimeout = window.setTimeout(this.handleNewMessages, 0);\n }\n }\n\n private handleNewMessages = () => {\n clearTimeout(this.newMessagesHandleTimeout);\n this.newMessagesHandleTimeout = 0;\n\n rootScope.dispatchEvent('history_multiappend', this.newMessagesToHandle);\n this.newMessagesToHandle = {};\n };\n\n private handleNewDialogs = () => {\n let newMaxSeenId = 0;\n const obj = this.newDialogsToHandle;\n for(const peerId in obj) {\n const dialog = obj[peerId];\n if(!dialog) {\n this.reloadConversation(peerId.toPeerId());\n delete obj[peerId];\n } else {\n this.dialogsStorage.pushDialog(dialog);\n if(!appPeersManager.isChannel(peerId.toPeerId())) {\n newMaxSeenId = Math.max(newMaxSeenId, dialog.top_message || 0);\n }\n }\n }\n\n //this.log('after order:', this.dialogsStorage[0].map(d => d.peerId));\n\n if(newMaxSeenId !== 0) {\n this.incrementMaxSeenId(newMaxSeenId);\n }\n\n rootScope.dispatchEvent('dialogs_multiupdate', obj);\n this.newDialogsToHandle = {};\n };\n\n public scheduleHandleNewDialogs(peerId?: PeerId, dialog?: Dialog) {\n if(peerId !== undefined) {\n this.newDialogsToHandle[peerId] = dialog;\n }\n\n if(this.newDialogsHandlePromise) return this.newDialogsHandlePromise;\n return this.newDialogsHandlePromise = new Promise<void>((resolve) => {\n setTimeout(() => {\n resolve();\n this.newDialogsHandlePromise = undefined;\n this.handleNewDialogs();\n }, 0);\n });\n }\n\n public deleteMessages(peerId: PeerId, mids: number[], revoke?: boolean) {\n let promise: Promise<any>;\n\n const localMessageIds = mids.map(mid => appMessagesIdsManager.getServerMessageId(mid));\n\n if(peerId.isAnyChat() && appPeersManager.isChannel(peerId)) {\n const channelId = peerId.toChatId();\n const channel: Chat.channel = appChatsManager.getChat(channelId);\n if(!channel.pFlags.creator && !channel.admin_rights?.pFlags?.delete_messages) {\n mids = mids.filter((mid) => {\n const message = this.getMessageByPeer(peerId, mid);\n return !!message.pFlags.out;\n });\n\n if(!mids.length) {\n return;\n }\n }\n\n promise = apiManager.invokeApi('channels.deleteMessages', {\n channel: appChatsManager.getChannelInput(channelId),\n id: localMessageIds\n }).then((affectedMessages) => {\n apiUpdatesManager.processLocalUpdate({\n _: 'updateDeleteChannelMessages',\n channel_id: channelId,\n messages: mids,\n pts: affectedMessages.pts,\n pts_count: affectedMessages.pts_count\n });\n });\n } else {\n promise = apiManager.invokeApi('messages.deleteMessages', {\n revoke,\n id: localMessageIds\n }).then((affectedMessages) => {\n apiUpdatesManager.processLocalUpdate({\n _: 'updateDeleteMessages',\n messages: mids,\n pts: affectedMessages.pts,\n pts_count: affectedMessages.pts_count\n });\n });\n }\n\n return promise;\n }\n\n public readHistory(peerId: PeerId, maxId = 0, threadId?: number, force = false) {\n if(DO_NOT_READ_HISTORY) {\n return Promise.resolve();\n }\n\n // console.trace('start read')\n this.log('readHistory:', peerId, maxId, threadId);\n if(!this.getReadMaxIdIfUnread(peerId, threadId) && !force) {\n this.log('readHistory: isn\\'t unread');\n return Promise.resolve();\n }\n\n const historyStorage = this.getHistoryStorage(peerId, threadId);\n\n if(historyStorage.triedToReadMaxId >= maxId) {\n return Promise.resolve();\n }\n\n let apiPromise: Promise<any>;\n if(threadId) {\n if(!historyStorage.readPromise) {\n apiPromise = apiManager.invokeApi('messages.readDiscussion', {\n peer: appPeersManager.getInputPeerById(peerId),\n msg_id: appMessagesIdsManager.getServerMessageId(threadId),\n read_max_id: appMessagesIdsManager.getServerMessageId(maxId)\n });\n }\n\n apiUpdatesManager.processLocalUpdate({\n _: 'updateReadChannelDiscussionInbox',\n channel_id: peerId.toChatId(),\n top_msg_id: threadId,\n read_max_id: maxId\n });\n } else if(appPeersManager.isChannel(peerId)) {\n if(!historyStorage.readPromise) {\n apiPromise = apiManager.invokeApi('channels.readHistory', {\n channel: appChatsManager.getChannelInput(peerId.toChatId()),\n max_id: appMessagesIdsManager.getServerMessageId(maxId)\n });\n }\n\n apiUpdatesManager.processLocalUpdate({\n _: 'updateReadChannelInbox',\n max_id: maxId,\n channel_id: peerId.toChatId(),\n still_unread_count: undefined,\n pts: undefined\n });\n } else {\n if(!historyStorage.readPromise) {\n apiPromise = apiManager.invokeApi('messages.readHistory', {\n peer: appPeersManager.getInputPeerById(peerId),\n max_id: appMessagesIdsManager.getServerMessageId(maxId)\n }).then((affectedMessages) => {\n apiUpdatesManager.processUpdateMessage({\n _: 'updateShort',\n update: {\n _: 'updatePts',\n pts: affectedMessages.pts,\n pts_count: affectedMessages.pts_count\n }\n });\n });\n }\n\n apiUpdatesManager.processLocalUpdate({\n _: 'updateReadHistoryInbox',\n max_id: maxId,\n peer: appPeersManager.getOutputPeer(peerId),\n still_unread_count: undefined,\n pts: undefined,\n pts_count: undefined\n });\n }\n\n appNotificationsManager.soundReset(appPeersManager.getPeerString(peerId));\n\n if(historyStorage.readPromise) {\n return historyStorage.readPromise;\n }\n\n historyStorage.triedToReadMaxId = maxId;\n\n apiPromise.finally(() => {\n delete historyStorage.readPromise;\n\n const {readMaxId} = historyStorage;\n this.log('readHistory: promise finally', maxId, readMaxId);\n\n if(readMaxId > maxId) {\n this.readHistory(peerId, readMaxId, threadId, true);\n }\n });\n\n return historyStorage.readPromise = apiPromise;\n }\n\n public readAllHistory(peerId: PeerId, threadId?: number, force = false) {\n const historyStorage = this.getHistoryStorage(peerId, threadId);\n if(historyStorage.maxId) {\n this.readHistory(peerId, historyStorage.maxId, threadId, force); // lol\n }\n }\n\n public fixDialogUnreadMentionsIfNoMessage(peerId: PeerId) {\n const dialog = this.getDialogOnly(peerId);\n if(dialog?.unread_mentions_count) {\n this.reloadConversation(peerId);\n }\n }\n\n public modifyCachedMentions(peerId: PeerId, mid: number, add: boolean) {\n const slicedArray = this.unreadMentions[peerId];\n if(!slicedArray) return;\n\n if(add) {\n if(slicedArray.first.isEnd(SliceEnd.Top)) {\n slicedArray.insertSlice([mid]);\n }\n } else {\n slicedArray.delete(mid);\n }\n }\n\n private fixUnreadMentionsCountIfNeeded(peerId: PeerId, slicedArray: SlicedArray) {\n const dialog = this.getDialogOnly(peerId);\n if(!slicedArray.length && dialog?.unread_mentions_count) {\n this.reloadConversation(peerId);\n }\n }\n\n public goToNextMention(peerId: PeerId) {\n /* this.getUnreadMentions(peerId, 1, 2, 0).then(messages => {\n console.log(messages);\n }); */\n\n const promise = this.goToNextMentionPromises[peerId];\n if(promise) {\n return promise;\n }\n\n const slicedArray = this.unreadMentions[peerId] ?? (this.unreadMentions[peerId] = new SlicedArray());\n const length = slicedArray.length;\n const isTopEnd = slicedArray.first.isEnd(SliceEnd.Top);\n if(!length && isTopEnd) {\n this.fixUnreadMentionsCountIfNeeded(peerId, slicedArray);\n return Promise.resolve();\n }\n\n let loadNextPromise = Promise.resolve();\n if(!isTopEnd && length < 25) {\n loadNextPromise = this.loadNextMentions(peerId);\n }\n\n return this.goToNextMentionPromises[peerId] = loadNextPromise.then(() => {\n const last = slicedArray.last;\n const mid = last && last[last.length - 1];\n if(mid) {\n slicedArray.delete(mid);\n rootScope.dispatchEvent('history_focus', {peerId, mid});\n } else {\n this.fixUnreadMentionsCountIfNeeded(peerId, slicedArray);\n }\n }).finally(() => {\n delete this.goToNextMentionPromises[peerId];\n });\n }\n\n public loadNextMentions(peerId: PeerId) {\n const slicedArray = this.unreadMentions[peerId];\n const maxId = slicedArray.first[0] || 1;\n\n const backLimit = 50;\n const add_offset = -backLimit;\n const limit = backLimit;\n return this.getUnreadMentions(peerId, maxId, add_offset, limit).then(messages => {\n this.mergeHistoryResult(slicedArray, messages, maxId === 1 ? 0 : maxId, limit, add_offset);\n });\n }\n\n public getUnreadMentions(peerId: PeerId, offsetId: number, add_offset: number, limit: number, maxId = 0, minId = 0) {\n return apiManager.invokeApiSingle('messages.getUnreadMentions', {\n peer: appPeersManager.getInputPeerById(peerId),\n offset_id: appMessagesIdsManager.getServerMessageId(offsetId),\n add_offset,\n limit,\n max_id: appMessagesIdsManager.getServerMessageId(maxId),\n min_id: appMessagesIdsManager.getServerMessageId(minId)\n }).then(messagesMessages => {\n assumeType<Exclude<MessagesMessages, MessagesMessages.messagesMessagesNotModified>>(messagesMessages);\n appUsersManager.saveApiUsers(messagesMessages.users);\n appChatsManager.saveApiChats(messagesMessages.chats);\n this.saveMessages(messagesMessages.messages);\n\n return messagesMessages;\n });\n }\n\n public readMessages(peerId: PeerId, msgIds: number[]) {\n if(DO_NOT_READ_HISTORY) {\n return Promise.resolve();\n }\n\n if(!msgIds.length) {\n return Promise.resolve();\n }\n\n msgIds = msgIds.map(mid => appMessagesIdsManager.getServerMessageId(mid));\n let promise: Promise<any>, update: Update.updateChannelReadMessagesContents | Update.updateReadMessagesContents;\n if(peerId.isAnyChat() && appPeersManager.isChannel(peerId)) {\n const channelId = peerId.toChatId();\n\n update = {\n _: 'updateChannelReadMessagesContents',\n channel_id: channelId,\n messages: msgIds\n };\n\n promise = apiManager.invokeApi('channels.readMessageContents', {\n channel: appChatsManager.getChannelInput(channelId),\n id: msgIds\n });\n } else {\n update = {\n _: 'updateReadMessagesContents',\n messages: msgIds,\n pts: undefined,\n pts_count: undefined\n };\n\n promise = apiManager.invokeApi('messages.readMessageContents', {\n id: msgIds\n }).then((affectedMessages) => {\n (update as Update.updateReadMessagesContents).pts = affectedMessages.pts;\n (update as Update.updateReadMessagesContents).pts_count = affectedMessages.pts_count;\n apiUpdatesManager.processLocalUpdate(update);\n });\n }\n\n apiUpdatesManager.processLocalUpdate(update);\n\n return promise;\n }\n\n public getHistoryStorage(peerId: PeerId, threadId?: number) {\n if(threadId) {\n //threadId = this.getLocalMessageId(threadId);\n if(!this.threadsStorage[peerId]) this.threadsStorage[peerId] = {};\n return this.threadsStorage[peerId][threadId] ?? (this.threadsStorage[peerId][threadId] = {count: null, history: new SlicedArray()});\n }\n\n return this.historiesStorage[peerId] ?? (this.historiesStorage[peerId] = {count: null, history: new SlicedArray()});\n }\n\n private handleNotifications = () => {\n window.clearTimeout(this.notificationsHandlePromise);\n this.notificationsHandlePromise = 0;\n\n //var timeout = $rootScope.idle.isIDLE && StatusManager.isOtherDeviceActive() ? 30000 : 1000;\n //const timeout = 1000;\n\n for(const _peerId in this.notificationsToHandle) {\n const peerId = _peerId.toPeerId();\n if(rootScope.peerId === peerId && !rootScope.idle.isIDLE) {\n continue;\n }\n\n const notifyPeerToHandle = this.notificationsToHandle[peerId];\n\n Promise.all([\n appNotificationsManager.getNotifyPeerTypeSettings(),\n appNotificationsManager.getNotifySettings(appPeersManager.getInputNotifyPeerById(peerId, true))\n ]).then(([_, peerTypeNotifySettings]) => {\n const topMessage = notifyPeerToHandle.topMessage;\n if(appNotificationsManager.isPeerLocalMuted(peerId, true) || !topMessage.pFlags.unread) {\n return;\n }\n\n //setTimeout(() => {\n if(topMessage.pFlags.unread) {\n this.notifyAboutMessage(topMessage, {\n fwdCount: notifyPeerToHandle.fwdCount,\n peerTypeNotifySettings\n });\n }\n //}, timeout);\n });\n }\n\n this.notificationsToHandle = {};\n };\n\n private onUpdateMessageId = (update: Update.updateMessageID) => {\n const randomId = update.random_id;\n const pendingData = this.pendingByRandomId[randomId];\n //this.log('AMM updateMessageID:', update, pendingData);\n if(pendingData) {\n const {peerId, tempId, threadId, storage} = pendingData;\n const mid = appMessagesIdsManager.generateMessageId(update.id);\n const message = this.getMessageFromStorage(storage, mid);\n if(!message.deleted) {\n [this.getHistoryStorage(peerId), threadId ? this.getHistoryStorage(peerId, threadId) : undefined]\n .filter(Boolean)\n .forEach(storage => {\n storage.history.delete(tempId);\n });\n\n this.finalizePendingMessageCallbacks(storage, tempId, message);\n } else {\n this.pendingByMessageId[mid] = randomId;\n }\n }\n };\n\n private onUpdateNewMessage = (update: Update.updateNewDiscussionMessage | Update.updateNewMessage | Update.updateNewChannelMessage) => {\n const message = update.message as MyMessage;\n const peerId = this.getMessagePeer(message);\n const storage = this.getMessagesStorage(peerId);\n const dialog = this.getDialogOnly(peerId);\n\n // * local update\n const isLocalThreadUpdate = update._ === 'updateNewDiscussionMessage';\n\n // * temporary save the message for info (peerId, reply mids...)\n this.saveMessages([message], {storage: new Map()});\n\n const threadKey = this.getThreadKey(message);\n const threadId = threadKey ? +threadKey.split('_')[1] : undefined;\n if(threadId && !isLocalThreadUpdate && this.threadsStorage[peerId] && this.threadsStorage[peerId][threadId]) {\n const update = {\n _: 'updateNewDiscussionMessage',\n message\n } as Update.updateNewDiscussionMessage;\n\n this.onUpdateNewMessage(update);\n }\n\n if(!dialog && !isLocalThreadUpdate) {\n let good = true;\n if(peerId.isAnyChat()) {\n good = appChatsManager.isInChat(peerId.toChatId());\n }\n\n if(good) {\n const set = this.newUpdatesAfterReloadToHandle[peerId] ?? (this.newUpdatesAfterReloadToHandle[peerId] = new Set());\n if(set.has(update)) {\n this.log.error('here we go again', peerId);\n return;\n }\n\n (update as any).ignoreExisting = true;\n set.add(update);\n this.scheduleHandleNewDialogs(peerId);\n }\n\n return;\n }\n\n /* if(update._ === 'updateNewChannelMessage') {\n const chat = appChatsManager.getChat(peerId.toChatId());\n if(chat.pFlags && (chat.pFlags.left || chat.pFlags.kicked)) {\n return;\n }\n } */\n\n this.saveMessages([message], {storage});\n // this.log.warn(dT(), 'message unread', message.mid, message.pFlags.unread)\n\n /* if((message as Message.message).grouped_id) {\n this.log('updateNewMessage', message);\n } */\n\n const pendingMessage = this.checkPendingMessage(message);\n const historyStorage = this.getHistoryStorage(peerId, isLocalThreadUpdate ? threadId : undefined);\n\n if(!isLocalThreadUpdate) {\n this.updateMessageRepliesIfNeeded(message);\n }\n\n // * so message can exist if reloadConversation came back earlier with mid\n const ignoreExisting: boolean = (update as any).ignoreExisting;\n const isExisting = !!historyStorage.history.findSlice(message.mid);\n if(isExisting) {\n if(!ignoreExisting) {\n return false;\n }\n } else {\n // * catch situation with disconnect. if message's id is lower than we already have (in bottom end slice), will sort it\n const firstSlice = historyStorage.history.first;\n if(firstSlice.isEnd(SliceEnd.Bottom)) {\n let i = 0;\n for(const length = firstSlice.length; i < length; ++i) {\n if(message.mid > firstSlice[i]) {\n break;\n }\n }\n\n firstSlice.splice(i, 0, message.mid);\n } else {\n historyStorage.history.unshift(message.mid);\n }\n\n if(historyStorage.count !== null) {\n historyStorage.count++;\n }\n }\n\n if(this.mergeReplyKeyboard(historyStorage, message)) {\n rootScope.dispatchEvent('history_reply_markup', {peerId});\n }\n\n const fromId = message.fromId;\n if(fromId.isUser() && !message.pFlags.out && message.from_id) {\n appUsersManager.forceUserOnline(fromId, message.date);\n\n const action: SendMessageAction = {\n _: 'sendMessageCancelAction'\n };\n\n let update: Update.updateUserTyping | Update.updateChatUserTyping | Update.updateChannelUserTyping;\n if(peerId.isUser()) {\n update = {\n _: 'updateUserTyping',\n action,\n user_id: fromId\n };\n } else if(appPeersManager.isChannel(peerId)) {\n update = {\n _: 'updateChannelUserTyping',\n action,\n channel_id: peerId.toChatId(),\n from_id: appPeersManager.getOutputPeer(fromId),\n top_msg_id: threadId ? appMessagesIdsManager.getServerMessageId(threadId) : undefined\n };\n } else {\n update = {\n _: 'updateChatUserTyping',\n action,\n chat_id: peerId.toChatId(),\n from_id: appPeersManager.getOutputPeer(fromId)\n };\n }\n\n apiUpdatesManager.processLocalUpdate(update);\n }\n\n if(!pendingMessage) {\n this.handleNewMessage(peerId, message.mid);\n }\n\n if(isLocalThreadUpdate) {\n return;\n }\n \n const inboxUnread = !message.pFlags.out && message.pFlags.unread;\n if(dialog) {\n if(inboxUnread && message.mid > dialog.top_message) {\n const releaseUnreadCount = this.dialogsStorage.prepareDialogUnreadCountModifying(dialog);\n\n ++dialog.unread_count;\n if(message.pFlags.mentioned) {\n ++dialog.unread_mentions_count;\n this.modifyCachedMentions(peerId, message.mid, true);\n }\n\n releaseUnreadCount();\n }\n\n if(message.mid >= dialog.top_message) {\n this.setDialogTopMessage(message, dialog);\n }\n }\n\n if(inboxUnread/* && ($rootScope.selectedPeerID != peerID || $rootScope.idle.isIDLE) */) {\n const notifyPeer = peerId;\n let notifyPeerToHandle = this.notificationsToHandle[notifyPeer];\n if(notifyPeerToHandle === undefined) {\n notifyPeerToHandle = this.notificationsToHandle[notifyPeer] = {\n fwdCount: 0,\n fromId: NULL_PEER_ID\n };\n }\n\n if(notifyPeerToHandle.fromId !== fromId) {\n notifyPeerToHandle.fromId = fromId;\n notifyPeerToHandle.fwdCount = 0;\n }\n\n if((message as Message.message).fwd_from) {\n ++notifyPeerToHandle.fwdCount;\n }\n\n notifyPeerToHandle.topMessage = message;\n\n if(!this.notificationsHandlePromise) {\n this.notificationsHandlePromise = window.setTimeout(this.handleNotifications, 0);\n }\n }\n };\n\n private onUpdateDialogUnreadMark = (update: Update.updateDialogUnreadMark) => {\n //this.log('updateDialogUnreadMark', update);\n const peerId = appPeersManager.getPeerId((update.peer as DialogPeer.dialogPeer).peer);\n const dialog = this.getDialogOnly(peerId);\n\n if(!dialog) {\n this.scheduleHandleNewDialogs(peerId);\n } else {\n const releaseUnreadCount = this.dialogsStorage.prepareDialogUnreadCountModifying(dialog);\n\n if(!update.pFlags.unread) {\n delete dialog.pFlags.unread_mark;\n } else {\n dialog.pFlags.unread_mark = true;\n }\n\n releaseUnreadCount();\n rootScope.dispatchEvent('dialogs_multiupdate', {[peerId]: dialog});\n this.dialogsStorage.setDialogToState(dialog);\n }\n };\n\n private onUpdateEditMessage = (update: Update.updateEditMessage | Update.updateEditChannelMessage) => {\n const message = update.message as MyMessage;\n const peerId = this.getMessagePeer(message);\n const mid = appMessagesIdsManager.generateMessageId(message.id);\n const storage = this.getMessagesStorage(peerId);\n if(!storage.has(mid)) {\n // this.fixDialogUnreadMentionsIfNoMessage(peerId);\n return;\n }\n\n // console.trace(dT(), 'edit message', message)\n \n const oldMessage: Message = this.getMessageFromStorage(storage, mid);\n this.saveMessages([message], {storage});\n const newMessage: Message = this.getMessageFromStorage(storage, mid);\n\n this.handleEditedMessage(oldMessage, newMessage);\n\n const dialog = this.getDialogOnly(peerId);\n\n // if sender erased mention\n /* if(dialog.unread_mentions_count && (oldMessage as Message.message)?.pFlags?.mentioned && !message.pFlags.mentioned) {\n --dialog.unread_mentions_count;\n this.modifyCachedMentions(peerId, mid, false);\n } */\n\n const isTopMessage = dialog && dialog.top_message === mid;\n if((message as Message.messageService).clear_history) {\n if(isTopMessage) {\n rootScope.dispatchEvent('dialog_flush', {peerId});\n }\n } else {\n rootScope.dispatchEvent('message_edit', {\n storage,\n peerId,\n mid\n });\n\n if(isTopMessage || (message as Message.message).grouped_id) {\n const updatedDialogs: {[peerId: PeerId]: Dialog} = {};\n updatedDialogs[peerId] = dialog;\n rootScope.dispatchEvent('dialogs_multiupdate', updatedDialogs);\n this.dialogsStorage.setDialogToState(dialog);\n }\n }\n };\n\n private onUpdateReadHistory = (update: Update.updateReadChannelDiscussionInbox | Update.updateReadChannelDiscussionOutbox \n | Update.updateReadHistoryInbox | Update.updateReadHistoryOutbox \n | Update.updateReadChannelInbox | Update.updateReadChannelOutbox) => {\n const channelId = (update as Update.updateReadChannelInbox).channel_id;\n const maxId = appMessagesIdsManager.generateMessageId((update as Update.updateReadChannelInbox).max_id || (update as Update.updateReadChannelDiscussionInbox).read_max_id);\n const threadId = appMessagesIdsManager.generateMessageId((update as Update.updateReadChannelDiscussionInbox).top_msg_id);\n const peerId = channelId ? channelId.toPeerId(true) : appPeersManager.getPeerId((update as Update.updateReadHistoryInbox).peer);\n\n const isOut = update._ === 'updateReadHistoryOutbox' || update._ === 'updateReadChannelOutbox' || update._ === 'updateReadChannelDiscussionOutbox' ? true : undefined;\n\n const storage = this.getMessagesStorage(peerId);\n const history = getObjectKeysAndSort(storage, 'desc');\n const foundDialog = this.getDialogOnly(peerId);\n const stillUnreadCount = (update as Update.updateReadChannelInbox).still_unread_count;\n let newUnreadCount = 0;\n let newUnreadMentionsCount = 0;\n let foundAffected = false;\n\n //this.log.warn(dT(), 'read', peerId, isOut ? 'out' : 'in', maxId)\n\n const historyStorage = this.getHistoryStorage(peerId, threadId);\n\n if(peerId.isUser() && isOut) {\n appUsersManager.forceUserOnline(peerId);\n }\n\n if(threadId) {\n const repliesKey = this.threadsToReplies[peerId + '_' + threadId];\n if(repliesKey) {\n const [peerId, mid] = repliesKey.split('_');\n this.updateMessage(peerId.toPeerId(), +mid, 'replies_updated');\n }\n }\n\n const releaseUnreadCount = !threadId && foundDialog && this.dialogsStorage.prepareDialogUnreadCountModifying(foundDialog);\n\n for(let i = 0, length = history.length; i < length; i++) {\n const mid = history[i];\n if(mid > maxId) {\n continue;\n }\n \n const message: MyMessage = storage.get(mid);\n\n if(message.pFlags.out !== isOut) {\n continue;\n }\n\n if(!message.pFlags.unread) {\n break;\n }\n\n if(threadId) {\n const replyTo = message.reply_to;\n if(!replyTo || (replyTo.reply_to_top_id || replyTo.reply_to_msg_id) !== threadId) {\n continue;\n }\n }\n \n // this.log.warn('read', messageId, message.pFlags.unread, message)\n if(message.pFlags.unread) {\n delete message.pFlags.unread;\n if(!foundAffected) {\n foundAffected = true;\n }\n\n if(!message.pFlags.out && !threadId && foundDialog) {\n if(stillUnreadCount === undefined) {\n newUnreadCount = --foundDialog.unread_count;\n }\n\n if(message.pFlags.mentioned) {\n newUnreadMentionsCount = --foundDialog.unread_mentions_count;\n this.modifyCachedMentions(peerId, message.mid, false);\n }\n }\n \n appNotificationsManager.cancel('msg' + mid);\n }\n }\n\n if(isOut) historyStorage.readOutboxMaxId = maxId;\n else historyStorage.readMaxId = maxId;\n\n if(!threadId && foundDialog) {\n if(isOut) foundDialog.read_outbox_max_id = maxId;\n else foundDialog.read_inbox_max_id = maxId;\n\n if(!isOut) {\n let setCount: number;\n if(stillUnreadCount !== undefined) {\n setCount = stillUnreadCount;\n } else if(newUnreadCount < 0 || !this.getReadMaxIdIfUnread(peerId)) {\n setCount = 0;\n } else if(newUnreadCount && foundDialog.top_message > maxId) {\n setCount = newUnreadCount;\n }\n\n if(setCount !== undefined) {\n foundDialog.unread_count = setCount;\n }\n\n if(newUnreadMentionsCount < 0 || !foundDialog.unread_count) {\n foundDialog.unread_mentions_count = 0;\n }\n }\n\n if(releaseUnreadCount) {\n releaseUnreadCount();\n }\n\n this.dialogsStorage.processDialogForFilters(foundDialog);\n \n rootScope.dispatchEvent('dialog_unread', {peerId});\n this.dialogsStorage.setDialogToState(foundDialog);\n }\n\n if(foundAffected) {\n rootScope.dispatchEvent('messages_read');\n }\n\n if(!threadId && channelId) {\n const threadKeyPart = peerId + '_';\n for(const threadKey in this.threadsToReplies) {\n if(threadKey.indexOf(threadKeyPart) === 0) {\n const [peerId, mid] = this.threadsToReplies[threadKey].split('_');\n rootScope.dispatchEvent('replies_updated', this.getMessageByPeer(peerId.toPeerId(), +mid));\n }\n }\n }\n };\n\n private onUpdateReadMessagesContents = (update: Update.updateChannelReadMessagesContents | Update.updateReadMessagesContents) => {\n const channelId = (update as Update.updateChannelReadMessagesContents).channel_id;\n const mids = (update as Update.updateReadMessagesContents).messages.map(id => appMessagesIdsManager.generateMessageId(id));\n const peerId = channelId ? channelId.toPeerId(true) : this.getMessageById(mids[0]).peerId;\n for(let i = 0, length = mids.length; i < length; ++i) {\n const mid = mids[i];\n const message: MyMessage = this.getMessageByPeer(peerId, mid);\n if(!message.deleted) {\n if(message.pFlags.media_unread) {\n delete message.pFlags.media_unread;\n this.setDialogToStateIfMessageIsTop(message);\n \n if(!message.pFlags.out && message.pFlags.mentioned) {\n this.modifyCachedMentions(peerId, mid, false);\n }\n }\n } else {\n this.fixDialogUnreadMentionsIfNoMessage(peerId);\n }\n }\n\n rootScope.dispatchEvent('messages_media_read', {peerId, mids});\n };\n\n private onUpdateChannelAvailableMessages = (update: Update.updateChannelAvailableMessages) => {\n const peerId = update.channel_id.toPeerId(true);\n const history = this.getHistoryStorage(peerId).history.slice;\n const availableMinId = appMessagesIdsManager.generateMessageId(update.available_min_id);\n const messages = history.filter(mid => mid <= availableMinId);\n\n (update as any as Update.updateDeleteChannelMessages).messages = messages;\n this.onUpdateDeleteMessages(update as any as Update.updateDeleteChannelMessages);\n };\n\n private onUpdateDeleteMessages = (update: Update.updateDeleteMessages | Update.updateDeleteChannelMessages) => {\n const channelId = (update as Update.updateDeleteChannelMessages).channel_id;\n //const messages = (update as any as Update.updateDeleteChannelMessages).messages;\n const messages = (update as any as Update.updateDeleteChannelMessages).messages.map(id => appMessagesIdsManager.generateMessageId(id));\n const peerId: PeerId = channelId ? channelId.toPeerId(true) : this.getMessageById(messages[0]).peerId;\n \n if(!peerId) {\n return;\n }\n\n apiManager.clearCache('messages.getSearchCounters', (params) => {\n return appPeersManager.getPeerId(params.peer) === peerId;\n });\n\n const threadKeys: Set<string> = new Set();\n for(const mid of messages) {\n const message = this.getMessageByPeer(peerId, mid);\n const threadKey = this.getThreadKey(message);\n if(threadKey && this.threadsStorage[peerId] && this.threadsStorage[peerId][+threadKey.split('_')[1]]) {\n threadKeys.add(threadKey);\n }\n }\n \n const historyUpdated = this.handleDeletedMessages(peerId, this.getMessagesStorage(peerId), messages);\n\n const threadsStorages = Array.from(threadKeys).map(threadKey => {\n const [peerId, mid] = threadKey.split('_');\n return this.getHistoryStorage(peerId.toPeerId(), +mid);\n });\n\n const historyStorage = this.getHistoryStorage(peerId);\n [historyStorage].concat(threadsStorages).forEach(historyStorage => {\n for(const mid of historyUpdated.msgs) {\n historyStorage.history.delete(mid);\n }\n \n if(historyUpdated.count && historyStorage.count) {\n historyStorage.count = Math.max(0, historyStorage.count - historyUpdated.count);\n }\n });\n\n rootScope.dispatchEvent('history_delete', {peerId, msgs: historyUpdated.msgs});\n\n const foundDialog = this.getDialogOnly(peerId);\n if(foundDialog) {\n const affected = historyUpdated.unreadMentions || historyUpdated.unread;\n const releaseUnreadCount = affected && this.dialogsStorage.prepareDialogUnreadCountModifying(foundDialog);\n \n if(historyUpdated.unread) {\n foundDialog.unread_count = Math.max(0, foundDialog.unread_count - historyUpdated.unread);\n }\n\n if(historyUpdated.unreadMentions) {\n foundDialog.unread_mentions_count = !foundDialog.unread_count ? 0 : Math.max(0, foundDialog.unread_mentions_count - historyUpdated.unreadMentions);\n }\n\n if(affected) {\n releaseUnreadCount();\n rootScope.dispatchEvent('dialog_unread', {peerId});\n }\n\n if(historyUpdated.msgs.has(foundDialog.top_message)) {\n const slice = historyStorage.history.first;\n if(slice.isEnd(SliceEnd.Bottom) && slice.length) {\n const mid = slice[0];\n const message = this.getMessageByPeer(peerId, mid);\n this.setDialogTopMessage(message, foundDialog);\n } else {\n this.reloadConversation(peerId);\n }\n }\n }\n };\n\n private onUpdateChannel = (update: Update.updateChannel) => {\n const channelId = update.channel_id;\n const peerId = channelId.toPeerId(true);\n const channel: Chat.channel = appChatsManager.getChat(channelId);\n\n const needDialog = appChatsManager.isInChat(channelId);\n \n const canViewHistory = !!channel.username || !channel.pFlags.left;\n const hasHistory = this.historiesStorage[peerId] !== undefined;\n \n if(canViewHistory !== hasHistory) {\n delete this.historiesStorage[peerId];\n rootScope.dispatchEvent('history_forbidden', peerId);\n }\n \n const dialog = this.getDialogOnly(peerId);\n if(!!dialog !== needDialog) {\n if(needDialog) {\n this.reloadConversation(peerId);\n } else {\n this.dialogsStorage.dropDialogOnDeletion(peerId);\n }\n }\n };\n\n private onUpdateChannelReload = (update: Update.updateChannelReload) => {\n const peerId = update.channel_id.toPeerId(true);\n\n this.dialogsStorage.dropDialog(peerId);\n\n delete this.historiesStorage[peerId];\n this.reloadConversation(peerId).then(() => {\n rootScope.dispatchEvent('history_reload', peerId);\n });\n };\n \n private onUpdateChannelMessageViews = (update: Update.updateChannelMessageViews) => {\n const views = update.views;\n const peerId = update.channel_id.toPeerId(true);\n const mid = appMessagesIdsManager.generateMessageId(update.id);\n const message: Message.message = this.getMessageByPeer(peerId, mid);\n if(!message.deleted && message.views !== undefined && message.views < views) {\n message.views = views;\n rootScope.dispatchEvent('message_views', {peerId, mid, views});\n this.setDialogToStateIfMessageIsTop(message);\n }\n };\n\n private onUpdateServiceNotification = (update: Update.updateServiceNotification) => {\n //this.log('updateServiceNotification', update);\n const fromId = SERVICE_PEER_ID;\n const peerId = fromId;\n const messageId = this.generateTempMessageId(peerId);\n const message: Message.message = {\n _: 'message',\n id: messageId,\n from_id: appPeersManager.getOutputPeer(fromId),\n peer_id: appPeersManager.getOutputPeer(peerId),\n pFlags: {unread: true},\n date: (update.inbox_date || tsNow(true)) + serverTimeManager.serverTimeOffset,\n message: update.message,\n media: update.media,\n entities: update.entities\n };\n if(!appUsersManager.hasUser(fromId)) {\n appUsersManager.saveApiUsers([{\n _: 'user',\n id: fromId,\n pFlags: {verified: true},\n access_hash: '0',\n first_name: 'Telegram',\n phone: '42777'\n }]);\n }\n this.saveMessages([message], {isOutgoing: true});\n\n if(update.inbox_date) {\n this.pendingTopMsgs[peerId] = messageId;\n this.onUpdateNewMessage({\n _: 'updateNewMessage',\n message,\n pts: undefined,\n pts_count: undefined\n });\n }\n };\n\n private onUpdatePinnedMessages = (update: Update.updatePinnedMessages | Update.updatePinnedChannelMessages) => {\n const channelId = update._ === 'updatePinnedChannelMessages' ? update.channel_id : undefined;\n const peerId = channelId ? channelId.toPeerId(true) : appPeersManager.getPeerId((update as Update.updatePinnedMessages).peer);\n\n /* const storage = this.getSearchStorage(peerId, 'inputMessagesFilterPinned');\n if(storage.count !== storage.history.length) {\n if(storage.count !== undefined) {\n delete this.searchesStorage[peerId]['inputMessagesFilterPinned']; \n }\n\n rootScope.broadcast('peer_pinned_messages', peerId);\n break;\n } */\n\n const messages = update.messages.map(id => appMessagesIdsManager.generateMessageId(id)); \n\n const storage = this.getMessagesStorage(peerId);\n const missingMessages = messages.filter(mid => !storage.has(mid));\n const getMissingPromise = missingMessages.length ? Promise.all(missingMessages.map(mid => this.wrapSingleMessage(peerId, mid))) : Promise.resolve();\n getMissingPromise.finally(() => {\n const werePinned = update.pFlags?.pinned;\n if(werePinned) {\n for(const mid of messages) {\n //storage.history.push(mid);\n const message = storage.get(mid);\n message.pFlags.pinned = true;\n }\n\n /* if(this.pinnedMessages[peerId]?.maxId) {\n const maxMid = Math.max(...messages);\n this.pinnedMessages\n } */\n\n //storage.history.sort((a, b) => b - a);\n } else {\n for(const mid of messages) {\n //storage.history.findAndSplice(_mid => _mid === mid);\n const message = storage.get(mid);\n delete message.pFlags.pinned;\n }\n }\n\n /* const info = this.pinnedMessages[peerId];\n if(info) {\n info.count += messages.length * (werePinned ? 1 : -1);\n } */\n \n delete this.pinnedMessages[peerId];\n appStateManager.getState().then(state => {\n delete state.hiddenPinnedMessages[peerId];\n rootScope.dispatchEvent('peer_pinned_messages', {peerId, mids: messages, pinned: werePinned});\n });\n });\n };\n\n private onUpdateNotifySettings = (update: Update.updateNotifySettings) => {\n const {peer, notify_settings} = update;\n if(peer._ === 'notifyPeer') {\n const peerId = appPeersManager.getPeerId((peer as NotifyPeer.notifyPeer).peer);\n \n const dialog = this.getDialogOnly(peerId);\n if(dialog) {\n dialog.notify_settings = notify_settings;\n rootScope.dispatchEvent('dialog_notify_settings', dialog);\n this.dialogsStorage.setDialogToState(dialog);\n }\n }\n };\n\n private onUpdateNewScheduledMessage = (update: Update.updateNewScheduledMessage) => {\n const message = update.message as MyMessage;\n const peerId = this.getMessagePeer(message);\n\n const storage = this.scheduledMessagesStorage[peerId];\n if(storage) {\n const mid = appMessagesIdsManager.generateMessageId(message.id);\n\n const oldMessage = this.getMessageFromStorage(storage, mid);\n this.saveMessages([message], {storage, isScheduled: true});\n const newMessage = this.getMessageFromStorage(storage, mid);\n\n if(!oldMessage.deleted) {\n this.handleEditedMessage(oldMessage, newMessage);\n rootScope.dispatchEvent('message_edit', {storage, peerId, mid: message.mid});\n } else {\n const pendingMessage = this.checkPendingMessage(message);\n if(!pendingMessage) {\n rootScope.dispatchEvent('scheduled_new', {peerId, mid: message.mid});\n }\n }\n }\n };\n\n private onUpdateDeleteScheduledMessages = (update: Update.updateDeleteScheduledMessages) => {\n const peerId = appPeersManager.getPeerId(update.peer);\n\n const storage = this.scheduledMessagesStorage[peerId];\n if(storage) {\n const mids = update.messages.map(id => appMessagesIdsManager.generateMessageId(id));\n this.handleDeletedMessages(peerId, storage, mids);\n\n rootScope.dispatchEvent('scheduled_delete', {peerId, mids});\n }\n };\n\n public setDialogToStateIfMessageIsTop(message: MyMessage) {\n if(this.isMessageIsTopMessage(message)) {\n this.dialogsStorage.setDialogToState(this.getDialogOnly(message.peerId));\n }\n }\n\n public isMessageIsTopMessage(message: MyMessage) {\n const dialog = this.getDialogOnly(message.peerId);\n return dialog && dialog.top_message === message.mid;\n }\n\n private updateMessageRepliesIfNeeded(threadMessage: MyMessage) {\n try { // * на всякий случай, скорее всего это не понадобится\n const threadKey = this.getThreadKey(threadMessage);\n if(threadKey) {\n const repliesKey = this.threadsToReplies[threadKey];\n if(repliesKey) {\n const [peerId, mid] = repliesKey.split('_');\n\n this.updateMessage(peerId.toPeerId(), +mid, 'replies_updated');\n }\n }\n } catch(err) {\n this.log.error('incrementMessageReplies err', err, threadMessage);\n }\n }\n\n private getThreadKey(threadMessage: MyMessage) {\n let threadKey = '';\n if(threadMessage.peerId?.isAnyChat() && threadMessage.reply_to) {\n const threadId = threadMessage.reply_to.reply_to_top_id || threadMessage.reply_to.reply_to_msg_id;\n threadKey = threadMessage.peerId + '_' + threadId;\n }\n\n return threadKey;\n }\n\n public updateMessage(peerId: PeerId, mid: number, broadcastEventName?: 'replies_updated'): Promise<Message.message> {\n const promise: Promise<Message.message> = this.wrapSingleMessage(peerId, mid, true).then(() => {\n const message = this.getMessageByPeer(peerId, mid);\n\n if(broadcastEventName) {\n rootScope.dispatchEvent(broadcastEventName, message);\n }\n\n return message;\n });\n \n return promise;\n }\n\n private checkPendingMessage(message: MyMessage) {\n const randomId = this.pendingByMessageId[message.mid];\n let pendingMessage: ReturnType<AppMessagesManager['finalizePendingMessage']>;\n if(randomId) {\n const pendingData = this.pendingByRandomId[randomId];\n if(pendingMessage = this.finalizePendingMessage(randomId, message)) {\n rootScope.dispatchEvent('history_update', {storage: pendingData.storage, peerId: message.peerId, mid: message.mid});\n }\n\n delete this.pendingByMessageId[message.mid];\n }\n\n return pendingMessage;\n }\n\n public mutePeer(peerId: PeerId, mute?: boolean) {\n const settings: InputPeerNotifySettings = {\n _: 'inputPeerNotifySettings'\n };\n\n if(mute === undefined) {\n mute = !appNotificationsManager.isPeerLocalMuted(peerId, false);\n }\n \n settings.mute_until = mute ? MUTE_UNTIL : 0;\n\n return appNotificationsManager.updateNotifySettings({\n _: 'inputNotifyPeer',\n peer: appPeersManager.getInputPeerById(peerId)\n }, settings);\n }\n\n public canSendToPeer(peerId: PeerId, threadId?: number, action: ChatRights = 'send_messages') {\n if(peerId.isAnyChat()) {\n //const isChannel = appPeersManager.isChannel(peerId);\n const chat: Chat.chat = appChatsManager.getChat(peerId.toChatId());\n const hasRights = /* isChannel && */appChatsManager.hasRights(peerId.toChatId(), action, undefined, !!threadId); \n return /* !isChannel || */hasRights && (!chat.pFlags.left || !!threadId);\n } else {\n return appUsersManager.canSendToUser(peerId);\n }\n }\n\n public finalizePendingMessage(randomId: Long, finalMessage: MyMessage) {\n const pendingData = this.pendingByRandomId[randomId];\n // this.log('pdata', randomID, pendingData)\n\n if(pendingData) {\n const {peerId, tempId, threadId, storage} = pendingData;\n\n [this.getHistoryStorage(peerId), threadId ? this.getHistoryStorage(peerId, threadId) : undefined]\n .filter(Boolean)\n .forEach(storage => {\n storage.history.delete(tempId);\n });\n\n // this.log('pending', randomID, historyStorage.pending)\n\n const tempMessage: MyMessage = this.getMessageFromStorage(storage, tempId);\n if(!tempMessage.deleted) {\n delete finalMessage.pFlags.is_outgoing;\n delete finalMessage.pending;\n delete finalMessage.error;\n delete finalMessage.random_id;\n delete finalMessage.send;\n }\n\n rootScope.dispatchEvent('messages_pending');\n \n delete this.pendingByRandomId[randomId];\n\n this.finalizePendingMessageCallbacks(storage, tempId, finalMessage);\n\n return tempMessage;\n }\n }\n\n public finalizePendingMessageCallbacks(storage: MessagesStorage, tempId: number, message: MyMessage) {\n const callbacks = this.tempFinalizeCallbacks[tempId];\n //this.log.warn(callbacks, tempId);\n if(callbacks !== undefined) {\n for(const name in callbacks) {\n const {deferred, callback} = callbacks[name];\n //this.log(`finalizePendingMessageCallbacks: will invoke ${name} callback`);\n callback(message).then(deferred.resolve, deferred.reject);\n }\n\n delete this.tempFinalizeCallbacks[tempId];\n }\n\n // set cached url to media\n if((message as Message.message).media) {\n assumeType<Message.message>(message);\n const {photo: newPhoto, document: newDoc} = message.media as any;\n if(newPhoto) {\n const photo = appPhotosManager.getPhoto('' + tempId);\n if(/* photo._ !== 'photoEmpty' */photo) {\n const newPhotoSize = newPhoto.sizes[newPhoto.sizes.length - 1];\n const cacheContext = appDownloadManager.getCacheContext(newPhoto, newPhotoSize.type);\n const oldCacheContext = appDownloadManager.getCacheContext(photo, 'full');\n Object.assign(cacheContext, oldCacheContext);\n\n const photoSize = newPhoto.sizes[newPhoto.sizes.length - 1] as PhotoSize.photoSize;\n\n const downloadOptions = appPhotosManager.getPhotoDownloadOptions(newPhoto, photoSize);\n const fileName = getFileNameByLocation(downloadOptions.location);\n appDownloadManager.fakeDownload(fileName, oldCacheContext.url);\n }\n } else if(newDoc) {\n const doc = appDocsManager.getDoc('' + tempId);\n if(doc) {\n if(/* doc._ !== 'documentEmpty' && */doc.type && doc.type !== 'sticker' && doc.mime_type !== 'image/gif') {\n const cacheContext = appDownloadManager.getCacheContext(newDoc);\n const oldCacheContext = appDownloadManager.getCacheContext(doc);\n Object.assign(cacheContext, oldCacheContext);\n\n const fileName = appDocsManager.getInputFileName(newDoc);\n appDownloadManager.fakeDownload(fileName, oldCacheContext.url);\n }\n }\n } else if((message.media as MessageMedia.messageMediaPoll).poll) {\n delete appPollsManager.polls[tempId];\n delete appPollsManager.results[tempId];\n }\n }\n\n const tempMessage = this.getMessageFromStorage(storage, tempId);\n storage.delete(tempId);\n \n this.handleReleasingMessage(tempMessage, storage);\n\n rootScope.dispatchEvent('message_sent', {storage, tempId, tempMessage, mid: message.mid, message});\n }\n\n public incrementMaxSeenId(maxId: number) {\n if(!maxId || !(!this.maxSeenId || maxId > this.maxSeenId)) {\n return false;\n }\n\n this.maxSeenId = maxId;\n appStateManager.pushToState('maxSeenMsgId', maxId);\n\n apiManager.invokeApi('messages.receivedMessages', {\n max_id: appMessagesIdsManager.getServerMessageId(maxId)\n });\n }\n\n public incrementMessageViews(peerId: PeerId, mids: number[]) {\n if(!mids.length) {\n return;\n }\n\n return apiManager.invokeApiSingle('messages.getMessagesViews', {\n peer: appPeersManager.getInputPeerById(peerId),\n id: mids.map(mid => appMessagesIdsManager.getServerMessageId(mid)),\n increment: true\n }).then(views => {\n const updates: Update[] = new Array(mids.length);\n const channelId = peerId.toChatId();\n for(let i = 0, length = mids.length; i < length; ++i) {\n updates[i] = {\n _: 'updateChannelMessageViews',\n channel_id: channelId,\n id: mids[i],\n views: views.views[i].views\n };\n }\n\n apiUpdatesManager.processUpdateMessage({\n _: 'updates',\n updates,\n chats: views.chats,\n users: views.users\n });\n });\n }\n\n private notifyAboutMessage(message: MyMessage, options: Partial<{\n fwdCount: number,\n peerTypeNotifySettings: PeerNotifySettings\n }> = {}) {\n const peerId = this.getMessagePeer(message);\n const notification: NotifyOptions = {};\n const peerString = appPeersManager.getPeerString(peerId);\n let notificationMessage: string;\n\n if(options.peerTypeNotifySettings.show_previews) {\n if(message._ === 'message' && message.fwd_from && options.fwdCount) {\n notificationMessage = I18n.format('Notifications.Forwarded', true, [options.fwdCount]);\n } else {\n notificationMessage = this.wrapMessageForReply(message, undefined, undefined, true);\n }\n } else {\n notificationMessage = I18n.format('Notifications.New', true);\n }\n\n notification.title = appPeersManager.getPeerTitle(peerId, true);\n if(peerId.isAnyChat() && message.fromId !== message.peerId) {\n notification.title = appPeersManager.getPeerTitle(message.fromId, true) +\n ' @ ' +\n notification.title;\n }\n\n notification.title = RichTextProcessor.wrapPlainText(notification.title);\n\n notification.onclick = () => {\n rootScope.dispatchEvent('history_focus', {peerId, mid: message.mid});\n };\n\n notification.message = notificationMessage;\n notification.key = 'msg' + message.mid;\n notification.tag = peerString;\n notification.silent = true;//message.pFlags.silent || false;\n\n const peerPhoto = appPeersManager.getPeerPhoto(peerId);\n if(peerPhoto) {\n appAvatarsManager.loadAvatar(peerId, peerPhoto, 'photo_small').loadPromise.then(url => {\n if(message.pFlags.unread) {\n notification.image = url;\n appNotificationsManager.notify(notification);\n }\n });\n } else {\n appNotificationsManager.notify(notification);\n }\n }\n\n public getScheduledMessagesStorage(peerId: PeerId) {\n return this.scheduledMessagesStorage[peerId] ?? (this.scheduledMessagesStorage[peerId] = this.createMessageStorage());\n }\n\n public getScheduledMessageByPeer(peerId: PeerId, mid: number) {\n return this.getMessageFromStorage(this.getScheduledMessagesStorage(peerId), mid);\n }\n\n public getScheduledMessages(peerId: PeerId): Promise<number[]> {\n if(!this.canSendToPeer(peerId)) return Promise.resolve([]);\n\n const storage = this.getScheduledMessagesStorage(peerId);\n if(storage.size) {\n return Promise.resolve([...storage.keys()]);\n }\n\n return apiManager.invokeApiSingle('messages.getScheduledHistory', {\n peer: appPeersManager.getInputPeerById(peerId),\n hash: ''\n }).then(historyResult => {\n if(historyResult._ !== 'messages.messagesNotModified') {\n appUsersManager.saveApiUsers(historyResult.users);\n appChatsManager.saveApiChats(historyResult.chats);\n \n const storage = this.getScheduledMessagesStorage(peerId);\n this.saveMessages(historyResult.messages, {storage, isScheduled: true});\n return [...storage.keys()];\n }\n \n return [];\n });\n }\n\n public sendScheduledMessages(peerId: PeerId, mids: number[]) {\n return apiManager.invokeApi('messages.sendScheduledMessages', {\n peer: appPeersManager.getInputPeerById(peerId),\n id: mids.map(mid => appMessagesIdsManager.getServerMessageId(mid))\n }).then(updates => {\n apiUpdatesManager.processUpdateMessage(updates);\n });\n }\n\n public deleteScheduledMessages(peerId: PeerId, mids: number[]) {\n return apiManager.invokeApi('messages.deleteScheduledMessages', {\n peer: appPeersManager.getInputPeerById(peerId),\n id: mids.map(mid => appMessagesIdsManager.getServerMessageId(mid))\n }).then(updates => {\n apiUpdatesManager.processUpdateMessage(updates);\n });\n }\n\n public getMessageWithReplies(message: Message.message) {\n if(message.peerId !== REPLIES_PEER_ID) {\n message = this.filterMessages(message, message => !!(message as Message.message).replies)[0] as any;\n if(!(message && message.replies && message.replies.pFlags.comments && message.replies.channel_id !== '777')) {\n return;\n }\n }\n\n return message;\n }\n\n public isFetchIntervalNeeded(peerId: PeerId) {\n return peerId.isAnyChat() && !appChatsManager.isInChat(peerId.toChatId());\n }\n\n public async getNewHistory(peerId: PeerId, threadId?: number) {\n if(!this.isFetchIntervalNeeded(peerId)) {\n return;\n }\n\n const historyStorage = this.getHistoryStorage(peerId, threadId);\n const slice = historyStorage.history.slice;\n if(!slice.isEnd(SliceEnd.Bottom)) {\n return;\n }\n\n delete historyStorage.maxId;\n slice.unsetEnd(SliceEnd.Bottom);\n\n // if there is no id - then request by first id because cannot request by id 0 with backLimit\n let historyResult = this.getHistory(peerId, slice[0] ?? 1, 0, 50, threadId);\n if(historyResult instanceof Promise) {\n historyResult = await historyResult;\n }\n\n for(let i = 0, length = historyResult.history.length; i < length; ++i) {\n this.handleNewMessage(peerId, historyResult.history[i]);\n }\n\n return historyStorage;\n }\n\n /**\n * * https://core.telegram.org/api/offsets, offset_id is inclusive\n */\n public getHistory(peerId: PeerId, maxId = 0, limit: number, backLimit?: number, threadId?: number): Promise<HistoryResult> | HistoryResult {\n const historyStorage = this.getHistoryStorage(peerId, threadId);\n\n let offset = 0;\n /* \n let offsetFound = true;\n\n if(maxId) {\n offsetFound = false;\n for(; offset < historyStorage.history.length; offset++) {\n if(maxId > historyStorage.history.slice[offset]) {\n offsetFound = true;\n break;\n }\n }\n }\n\n if(offsetFound && (\n historyStorage.count !== null && historyStorage.history.length === historyStorage.count ||\n historyStorage.history.length >= offset + limit\n )) {\n if(backLimit) {\n backLimit = Math.min(offset, backLimit);\n offset = Math.max(0, offset - backLimit);\n limit += backLimit;\n } else {\n limit = limit;\n }\n\n const history = historyStorage.history.slice.slice(offset, offset + limit);\n return {\n count: historyStorage.count,\n history: history,\n offsetIdOffset: offset\n };\n }\n\n if(offsetFound) {\n offset = 0;\n } */\n\n if(backLimit) {\n offset = -backLimit;\n limit += backLimit;\n\n /* return this.requestHistory(reqPeerId, maxId, limit, offset, undefined, threadId).then((historyResult) => {\n historyStorage.count = (historyResult as MessagesMessages.messagesMessagesSlice).count || historyResult.messages.length;\n\n const history = (historyResult.messages as MyMessage[]).map(message => message.mid);\n return {\n count: historyStorage.count,\n history,\n offsetIdOffset: (historyResult as MessagesMessages.messagesMessagesSlice).offset_id_offset || 0\n };\n }); */\n }\n\n const haveSlice = historyStorage.history.sliceMe(maxId, offset, limit);\n if(haveSlice && (haveSlice.slice.length === limit || (haveSlice.fulfilled & SliceEnd.Both) === SliceEnd.Both)) {\n return {\n count: historyStorage.count,\n history: haveSlice.slice,\n offsetIdOffset: haveSlice.offsetIdOffset\n }; \n }\n\n return this.fillHistoryStorage(peerId, maxId, limit, offset, historyStorage, threadId).then(() => {\n const slice = historyStorage.history.sliceMe(maxId, offset, limit);\n return {\n count: historyStorage.count,\n history: slice?.slice || historyStorage.history.constructSlice(),\n offsetIdOffset: slice?.offsetIdOffset || historyStorage.count\n };\n });\n }\n\n public isHistoryResultEnd(historyResult: Exclude<MessagesMessages, MessagesMessages.messagesMessagesNotModified>, limit: number, add_offset: number) {\n const {offset_id_offset, messages} = historyResult as MessagesMessages.messagesMessagesSlice;\n\n const count = (historyResult as MessagesMessages.messagesMessagesSlice).count || messages.length;\n const offsetIdOffset = offset_id_offset || 0;\n\n const topWasMeantToLoad = add_offset < 0 ? limit + add_offset : limit;\n\n const isTopEnd = offsetIdOffset >= (count - topWasMeantToLoad) || count < topWasMeantToLoad;\n const isBottomEnd = !offsetIdOffset || (add_offset < 0 && (offsetIdOffset + add_offset) <= 0);\n\n return {count, offsetIdOffset, isTopEnd, isBottomEnd};\n }\n\n public mergeHistoryResult(slicedArray: SlicedArray, \n historyResult: Parameters<AppMessagesManager['isHistoryResultEnd']>[0], \n offset_id: number, \n limit: number, \n add_offset: number) {\n const {messages} = historyResult as MessagesMessages.messagesMessagesSlice;\n const isEnd = this.isHistoryResultEnd(historyResult, limit, add_offset);\n const {count, offsetIdOffset, isTopEnd, isBottomEnd} = isEnd;\n const mids = messages.map((message) => {\n return (message as MyMessage).mid;\n });\n\n // * add bound manually. \n // * offset_id will be inclusive only if there is 'add_offset' <= -1 (-1 - will only include the 'offset_id')\n // * check that offset_id is not 0\n if(offset_id && appMessagesIdsManager.getServerMessageId(offset_id) && !mids.includes(offset_id) && offsetIdOffset < count) {\n let i = 0;\n for(const length = mids.length; i < length; ++i) {\n if(offset_id > mids[i]) {\n break;\n }\n }\n\n mids.splice(i, 0, offset_id);\n }\n\n const slice = slicedArray.insertSlice(mids) || slicedArray.slice;\n if(isTopEnd) {\n slice.setEnd(SliceEnd.Top);\n }\n \n if(isBottomEnd) {\n slice.setEnd(SliceEnd.Bottom);\n }\n\n return {slice, mids, messages, ...isEnd};\n }\n\n public fillHistoryStorage(peerId: PeerId, offset_id: number, limit: number, add_offset: number, historyStorage: HistoryStorage, threadId?: number): Promise<void> {\n return this.requestHistory(peerId, offset_id, limit, add_offset, undefined, threadId).then((historyResult) => {\n const {count, isBottomEnd, slice, messages} = this.mergeHistoryResult(historyStorage.history, historyResult, offset_id, limit, add_offset);\n\n historyStorage.count = count;\n\n /* if(!maxId && historyResult.messages.length) {\n maxId = this.incrementMessageId((historyResult.messages[0] as MyMessage).mid, 1);\n }\n\n const wasTotalCount = historyStorage.history.length; */\n\n for(let i = 0, length = messages.length; i < length; ++i) {\n const message = messages[i] as MyMessage;\n if(this.mergeReplyKeyboard(historyStorage, message)) {\n rootScope.dispatchEvent('history_reply_markup', {peerId});\n }\n }\n\n if(isBottomEnd) {\n historyStorage.maxId = slice[0]; // ! WARNING\n }\n \n /* const isBackLimit = offset < 0 && -offset !== fullLimit;\n if(isBackLimit) {\n return;\n }\n\n const totalCount = historyStorage.history.length;\n fullLimit -= (totalCount - wasTotalCount);\n\n const migratedNextPeer = this.migratedFromTo[peerId];\n const migratedPrevPeer = this.migratedToFrom[peerId]\n const isMigrated = migratedNextPeer !== undefined || migratedPrevPeer !== undefined;\n\n if(isMigrated) {\n historyStorage.count = Math.max(historyStorage.count, totalCount) + 1;\n }\n\n if(fullLimit > 0) {\n maxId = historyStorage.history.slice[totalCount - 1];\n if(isMigrated) {\n if(!historyResult.messages.length) {\n if(migratedPrevPeer) {\n maxId = 0;\n peerId = migratedPrevPeer;\n } else {\n historyStorage.count = totalCount;\n return true;\n }\n }\n\n return this.fillHistoryStorage(peerId, maxId, fullLimit, historyStorage, threadId);\n } else if(totalCount < historyStorage.count) {\n return this.fillHistoryStorage(peerId, maxId, fullLimit, offset, historyStorage, threadId);\n }\n } */\n });\n }\n\n public requestHistory(peerId: PeerId, maxId: number, limit = 0, offset = 0, offsetDate = 0, threadId = 0): Promise<Exclude<MessagesMessages, MessagesMessages.messagesMessagesNotModified>> {\n //console.trace('requestHistory', peerId, maxId, limit, offset);\n\n //rootScope.broadcast('history_request');\n\n const options: any = {\n peer: appPeersManager.getInputPeerById(peerId),\n offset_id: appMessagesIdsManager.getServerMessageId(maxId) || 0,\n offset_date: offsetDate,\n add_offset: offset,\n limit,\n max_id: 0,\n min_id: 0,\n hash: 0\n };\n\n if(threadId) {\n options.msg_id = appMessagesIdsManager.getServerMessageId(threadId) || 0;\n }\n\n const promise: ReturnType<AppMessagesManager['requestHistory']> = apiManager.invokeApiSingle(threadId ? 'messages.getReplies' : 'messages.getHistory', options, {\n //timeout: APITIMEOUT,\n noErrorBox: true\n }) as any;\n\n return promise.then((historyResult) => {\n if(DEBUG) {\n this.log('requestHistory result:', peerId, historyResult, maxId, limit, offset);\n }\n\n appUsersManager.saveApiUsers(historyResult.users);\n appChatsManager.saveApiChats(historyResult.chats);\n this.saveMessages(historyResult.messages);\n\n if(appPeersManager.isChannel(peerId)) {\n apiUpdatesManager.addChannelState(peerId.toChatId(), (historyResult as MessagesMessages.messagesChannelMessages).pts);\n }\n\n let length = historyResult.messages.length, count = (historyResult as MessagesMessages.messagesMessagesSlice).count;\n if(length && historyResult.messages[length - 1].deleted) {\n historyResult.messages.splice(length - 1, 1);\n length--;\n count--;\n }\n\n // will load more history if last message is album grouped (because it can be not last item)\n // historyResult.messages: desc sorted\n const historyStorage = this.getHistoryStorage(peerId, threadId);\n const oldestMessage: Message.message = historyResult.messages[length - 1] as any;\n if(length && oldestMessage.grouped_id) {\n const foundSlice = historyStorage.history.findSlice(oldestMessage.mid);\n if(foundSlice && (foundSlice.slice.length + historyResult.messages.length) < count) {\n return this.requestHistory(peerId, oldestMessage.mid, 10, 0, offsetDate, threadId).then((_historyResult) => {\n return historyResult;\n });\n }\n }\n\n return historyResult;\n }, (error) => {\n switch (error.type) {\n case 'CHANNEL_PRIVATE':\n let channel = appChatsManager.getChat(peerId.toChatId());\n channel = {_: 'channelForbidden', access_hash: channel.access_hash, title: channel.title};\n apiUpdatesManager.processUpdateMessage({\n _: 'updates',\n updates: [{\n _: 'updateChannel',\n channel_id: peerId.toChatId()\n }],\n chats: [channel],\n users: []\n });\n break;\n }\n\n throw error;\n });\n }\n\n public fetchSingleMessages() {\n if(this.fetchSingleMessagesPromise) {\n return this.fetchSingleMessagesPromise;\n }\n\n return this.fetchSingleMessagesPromise = new Promise((resolve) => {\n setTimeout(() => {\n const requestPromises: Promise<void>[] = [];\n \n for(const [peerId, map] of this.needSingleMessages) {\n const mids = [...map.keys()];\n const msgIds: InputMessage[] = mids.map((mid) => {\n return {\n _: 'inputMessageID',\n id: appMessagesIdsManager.getServerMessageId(mid)\n };\n });\n \n let promise: Promise<MethodDeclMap['channels.getMessages']['res'] | MethodDeclMap['messages.getMessages']['res']>;\n if(peerId.isAnyChat() && appPeersManager.isChannel(peerId)) {\n promise = apiManager.invokeApiSingle('channels.getMessages', {\n channel: appChatsManager.getChannelInput(peerId.toChatId()),\n id: msgIds\n });\n } else {\n promise = apiManager.invokeApiSingle('messages.getMessages', {\n id: msgIds\n });\n }\n\n const after = promise.then(getMessagesResult => {\n assumeType<Exclude<MessagesMessages.messagesMessages, MessagesMessages.messagesMessagesNotModified>>(getMessagesResult);\n\n appUsersManager.saveApiUsers(getMessagesResult.users);\n appChatsManager.saveApiChats(getMessagesResult.chats);\n this.saveMessages(getMessagesResult.messages);\n\n for(let i = 0; i < getMessagesResult.messages.length; ++i) {\n const message = getMessagesResult.messages[i];\n const mid = appMessagesIdsManager.generateMessageId(message.id);\n const promise = map.get(mid);\n promise.resolve(getMessagesResult.messages[i]);\n map.delete(mid);\n }\n\n if(map.size) {\n for(const [mid, promise] of map) {\n promise.resolve(this.generateEmptyMessage(mid));\n }\n }\n }).finally(() => {\n rootScope.dispatchEvent('messages_downloaded', {peerId, mids});\n });\n \n requestPromises.push(after);\n }\n\n this.needSingleMessages.clear();\n\n Promise.all(requestPromises).finally(() => {\n this.fetchSingleMessagesPromise = null;\n if(this.needSingleMessages.size) this.fetchSingleMessages();\n resolve();\n });\n }, 0);\n });\n }\n\n public wrapSingleMessage(peerId: PeerId, mid: number, overwrite = false): Promise<Message> {\n const message = this.getMessageByPeer(peerId, mid);\n if(!message.deleted && !overwrite) {\n rootScope.dispatchEvent('messages_downloaded', {peerId, mids: [mid]});\n return Promise.resolve(message);\n } else {\n let map = this.needSingleMessages.get(peerId);\n if(!map) {\n this.needSingleMessages.set(peerId, map = new Map());\n }\n\n let promise = map.get(mid);\n if(promise) {\n return promise;\n }\n\n promise = deferredPromise();\n map.set(mid, promise);\n this.fetchSingleMessages();\n return promise;\n }\n }\n\n public fetchMessageReplyTo(message: MyMessage): Promise<Message> {\n if(!message.reply_to_mid) return Promise.resolve(this.generateEmptyMessage(0));\n const replyToPeerId = message.reply_to.reply_to_peer_id ? appPeersManager.getPeerId(message.reply_to.reply_to_peer_id) : message.peerId;\n return this.wrapSingleMessage(replyToPeerId, message.reply_to_mid).then(originalMessage => {\n if(originalMessage.deleted) { // ! чтобы не пыталось бесконечно загрузить удалённое сообщение\n delete message.reply_to_mid; // ! WARNING!\n }\n\n return originalMessage;\n });\n }\n\n public setTyping(peerId: PeerId, action: SendMessageAction, force?: boolean): Promise<boolean> {\n let typing = this.typings[peerId];\n if(!rootScope.myId || \n !peerId || \n !this.canSendToPeer(peerId) || \n peerId === rootScope.myId ||\n // (!force && deepEqual(typing?.action, action))\n (!force && typing?.action?._ === action._)\n ) {\n return Promise.resolve(false);\n }\n\n if(typing?.timeout) {\n clearTimeout(typing.timeout);\n }\n\n typing = this.typings[peerId] = {\n action\n };\n\n return apiManager.invokeApi('messages.setTyping', {\n peer: appPeersManager.getInputPeerById(peerId),\n action\n }).finally(() => {\n if(typing === this.typings[peerId]) {\n typing.timeout = window.setTimeout(() => {\n delete this.typings[peerId];\n }, 6000);\n }\n });\n }\n\n private handleReleasingMessage(message: MyMessage, storage: MessagesStorage) {\n const media = (message as Message.message).media;\n if(media) {\n const c = (media as MessageMedia.messageMediaWebPage).webpage as WebPage.webPage || media as MessageMedia.messageMediaPhoto | MessageMedia.messageMediaDocument;\n const smth: Photo.photo | MyDocument = (c as MessageMedia.messageMediaPhoto).photo as any || (c as MessageMedia.messageMediaDocument).document as any;\n\n if(smth?.file_reference) {\n referenceDatabase.deleteContext(smth.file_reference, {type: 'message', peerId: message.peerId, messageId: message.mid});\n }\n\n if('webpage' in media && media.webpage) {\n const isScheduled = this.getScheduledMessagesStorage(message.peerId) === storage;\n const messageKey = appWebPagesManager.getMessageKeyForPendingWebPage(message.peerId, message.mid, isScheduled);\n appWebPagesManager.deleteWebPageFromPending(media.webpage, messageKey);\n }\n\n if((media as MessageMedia.messageMediaPoll).poll) {\n appPollsManager.updatePollToMessage(message as Message.message, false);\n }\n }\n }\n\n private handleDeletedMessages(peerId: PeerId, storage: MessagesStorage, messages: number[]) {\n const history: {\n count: number, \n unread: number, \n unreadMentions: number, \n msgs: Set<number>,\n albums?: {[groupId: string]: Set<number>},\n } = {\n count: 0, \n unread: 0, \n unreadMentions: 0, \n msgs: new Set()\n };\n\n for(const mid of messages) {\n const message: MyMessage = this.getMessageFromStorage(storage, mid);\n if(message.deleted) {\n this.fixDialogUnreadMentionsIfNoMessage(peerId);\n continue;\n }\n\n this.handleReleasingMessage(message, storage);\n\n this.updateMessageRepliesIfNeeded(message);\n\n if(!message.pFlags.out && !message.pFlags.is_outgoing && message.pFlags.unread) {\n ++history.unread;\n appNotificationsManager.cancel('msg' + mid);\n\n if(message.pFlags.mentioned) {\n ++history.unreadMentions;\n this.modifyCachedMentions(peerId, mid, false);\n }\n }\n\n ++history.count;\n history.msgs.add(mid);\n\n message.deleted = true;\n\n const groupedId = (message as Message.message).grouped_id;\n if(groupedId) {\n const groupedStorage = this.groupedMessagesStorage[groupedId];\n if(groupedStorage) {\n groupedStorage.delete(mid);\n\n if(!history.albums) history.albums = {};\n (history.albums[groupedId] || (history.albums[groupedId] = new Set())).add(mid);\n\n if(!groupedStorage.size) {\n delete history.albums;\n delete this.groupedMessagesStorage[groupedId];\n }\n }\n }\n\n storage.delete(mid);\n\n const peerMessagesToHandle = this.newMessagesToHandle[peerId];\n if(peerMessagesToHandle && peerMessagesToHandle.has(mid)) {\n peerMessagesToHandle.delete(mid);\n }\n }\n\n if(history.albums) {\n for(const groupId in history.albums) {\n rootScope.dispatchEvent('album_edit', {peerId, groupId, deletedMids: [...history.albums[groupId]]});\n /* const mids = this.getMidsByAlbum(groupId);\n if(mids.length) {\n const mid = Math.max(...mids);\n rootScope.$broadcast('message_edit', {peerId, mid, justMedia: false});\n } */\n }\n }\n\n return history;\n }\n \n private handleEditedMessage(oldMessage: Message, newMessage: Message) {\n if(oldMessage._ === 'message') {\n if((oldMessage.media as MessageMedia.messageMediaWebPage)?.webpage) {\n const messageKey = appWebPagesManager.getMessageKeyForPendingWebPage(oldMessage.peerId, oldMessage.mid, !!oldMessage.pFlags.is_scheduled);\n appWebPagesManager.deleteWebPageFromPending((oldMessage.media as MessageMedia.messageMediaWebPage).webpage, messageKey);\n }\n }\n }\n\n public getMediaFromMessage(message: any) {\n return message.action ? \n message.action.photo : \n message.media && (\n message.media.photo || \n message.media.document || (\n message.media.webpage && (\n message.media.webpage.document || \n message.media.webpage.photo\n )\n )\n );\n }\n\n public isMentionUnread(message: MyMessage) {\n const doc = ((message as Message.message).media as MessageMedia.messageMediaDocument)?.document as MyDocument;\n return message.pFlags.media_unread && \n message.pFlags.mentioned && \n (\n !doc || \n !(['voice', 'round'] as MyDocument['type'][]).includes(doc.type)\n );\n }\n\n public getDialogUnreadCount(dialog: Dialog) {\n return dialog.unread_count || +!!dialog.pFlags.unread_mark;\n }\n\n public isDialogUnread(dialog: Dialog) {\n return !!this.getDialogUnreadCount(dialog);\n }\n\n public canForward(message: Message.message | Message.messageService) {\n return !(message as Message.message).pFlags.noforwards && !appPeersManager.noForwards(message.peerId);\n }\n}\n\nconst appMessagesManager = new AppMessagesManager();\nMOUNT_CLASS_TO.appMessagesManager = appMessagesManager;\nexport default appMessagesManager;\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov <igor.beatle@gmail.com>\r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport type { Chat, ChatPhoto, DialogPeer, InputChannel, InputDialogPeer, InputNotifyPeer, InputPeer, Peer, Update, User, UserProfilePhoto } from \"../../layer\";\r\nimport type { LangPackKey } from \"../langPack\";\r\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\r\nimport { isObject } from \"../../helpers/object\";\r\nimport { RichTextProcessor } from \"../richtextprocessor\";\r\nimport rootScope from \"../rootScope\";\r\nimport appChatsManager from \"./appChatsManager\";\r\nimport appUsersManager from \"./appUsersManager\";\r\nimport I18n from '../langPack';\r\nimport { NULL_PEER_ID } from \"../mtproto/mtproto_config\";\r\n\r\n// https://github.com/eelcohn/Telegram-API/wiki/Calculating-color-for-a-Telegram-user-on-IRC\r\n/*\r\n HTML-color IRC-color Description\r\n #c03d33 4 red\r\n #4fad2d 3 green\r\n #d09306 7 yellow\r\n #168acd 10 blue\r\n #8544d6 6 purple\r\n #cd4073 13 pink\r\n #2996ad 11 sea\r\n #ce671b 5 orange\r\n */\r\nconst DialogColorsFg = ['#fc5c51', '#0fb297', '#d09306', '#3d72ed', '#895dd5', '#cd4073', '#00c1a6', '#fa790f'];\r\nconst DialogColors = ['red', 'green', 'yellow', 'blue', 'violet', 'pink', 'cyan', 'orange'];\r\nconst DialogColorsMap = [0, 7, 4, 1, 6, 3, 5];\r\n\r\nexport type PeerType = 'channel' | 'chat' | 'megagroup' | 'group' | 'saved';\r\nexport class AppPeersManager {\r\n /* public savePeerInstance(peerId: PeerId, instance: any) {\r\n if(peerId < 0) appChatsManager.saveApiChat(instance);\r\n else appUsersManager.saveApiUser(instance);\r\n } */\r\n\r\n public canPinMessage(peerId: PeerId) {\r\n return peerId.isUser() || appChatsManager.hasRights(peerId.toChatId(), 'pin_messages');\r\n }\r\n\r\n public getPeerPhoto(peerId: PeerId): UserProfilePhoto.userProfilePhoto | ChatPhoto.chatPhoto {\r\n const photo = peerId.isUser() \r\n ? appUsersManager.getUserPhoto(peerId.toUserId())\r\n : appChatsManager.getChatPhoto(peerId.toChatId());\r\n\r\n return photo._ !== 'chatPhotoEmpty' && photo._ !== 'userProfilePhotoEmpty' ? photo : null;\r\n }\r\n\r\n public getPeerMigratedTo(peerId: PeerId) {\r\n if(peerId.isUser()) {\r\n return false;\r\n }\r\n\r\n const chat: Chat.chat = appChatsManager.getChat(peerId.toChatId());\r\n if(chat && chat.migrated_to && chat.pFlags.deactivated) {\r\n return this.getPeerId(chat.migrated_to as InputChannel.inputChannel);\r\n }\r\n \r\n return false;\r\n }\r\n\r\n public getPeerTitle(peerId: PeerId, plainText = false, onlyFirstName = false) {\r\n if(!peerId) {\r\n peerId = rootScope.myId;\r\n }\r\n \r\n let title = '';\r\n if(peerId.isUser()) {\r\n const user = appUsersManager.getUser(peerId.toUserId());\r\n if(user.first_name) title += user.first_name;\r\n if(user.last_name && (!onlyFirstName || !title)) title += ' ' + user.last_name;\r\n \r\n if(!title) title = user.pFlags.deleted ? I18n.format('HiddenName', true) : user.username;\r\n else title = title.trim();\r\n } else {\r\n const chat: Chat.chat = appChatsManager.getChat(peerId.toChatId());\r\n title = chat.title;\r\n\r\n if(onlyFirstName) {\r\n title = title.split(' ')[0];\r\n }\r\n }\r\n \r\n return plainText ? title : RichTextProcessor.wrapEmojiText(title);\r\n }\r\n\r\n public getOutputPeer(peerId: PeerId): Peer {\r\n if(peerId.isUser()) {\r\n return {_: 'peerUser', user_id: peerId.toUserId()};\r\n }\r\n\r\n const chatId = peerId.toChatId();\r\n if(appChatsManager.isChannel(chatId)) {\r\n return {_: 'peerChannel', channel_id: chatId};\r\n }\r\n\r\n return {_: 'peerChat', chat_id: chatId};\r\n }\r\n\r\n public getPeerString(peerId: PeerId) {\r\n if(peerId.isUser()) {\r\n return appUsersManager.getUserString(peerId.toUserId());\r\n }\r\n return appChatsManager.getChatString(peerId.toChatId());\r\n }\r\n\r\n public getPeerUsername(peerId: PeerId): string {\r\n return this.getPeer(peerId).username || '';\r\n }\r\n\r\n public getPeer(peerId: PeerId) {\r\n return peerId.isUser()\r\n ? appUsersManager.getUser(peerId.toUserId())\r\n : appChatsManager.getChat(peerId.toChatId());\r\n }\r\n\r\n public getPeerId(peerId: {user_id: UserId} | {channel_id: ChatId} | {chat_id: ChatId} | InputPeer | PeerId | string): PeerId {\r\n if(peerId !== undefined && ((peerId as string).isPeerId ? (peerId as string).isPeerId() : false)) return peerId as PeerId;\r\n // if(typeof(peerId) === 'string' && /^[uc]/.test(peerId)) return peerId as PeerId;\r\n // if(typeof(peerId) === 'number') return peerId;\r\n else if(isObject(peerId)) {\r\n const userId = (peerId as Peer.peerUser).user_id;\r\n if(userId !== undefined) {\r\n return userId.toPeerId(false);\r\n }\r\n\r\n const chatId = (peerId as Peer.peerChannel).channel_id || (peerId as Peer.peerChat).chat_id;\r\n if(chatId !== undefined) {\r\n return chatId.toPeerId(true);\r\n }\r\n\r\n return rootScope.myId; // maybe it is an inputPeerSelf\r\n // } else if(!peerId) return 'u0';\r\n } else if(!peerId) return NULL_PEER_ID;\r\n \r\n const isUser = (peerId as string).charAt(0) === 'u';\r\n const peerParams = (peerId as string).substr(1).split('_');\r\n\r\n return isUser ? peerParams[0].toPeerId() : (peerParams[0] || '').toPeerId(true);\r\n }\r\n\r\n public getDialogPeer(peerId: PeerId): DialogPeer {\r\n return {\r\n _: 'dialogPeer',\r\n peer: this.getOutputPeer(peerId)\r\n };\r\n }\r\n\r\n public isChannel(peerId: PeerId): boolean {\r\n return !peerId.isUser() && appChatsManager.isChannel(peerId.toChatId());\r\n }\r\n\r\n public isMegagroup(peerId: PeerId) {\r\n return !peerId.isUser() && appChatsManager.isMegagroup(peerId.toChatId());\r\n }\r\n\r\n public isAnyGroup(peerId: PeerId): boolean {\r\n return !peerId.isUser() && !appChatsManager.isBroadcast(peerId.toChatId());\r\n }\r\n\r\n public isBroadcast(peerId: PeerId): boolean {\r\n return this.isChannel(peerId) && !this.isMegagroup(peerId);\r\n }\r\n\r\n public isBot(peerId: PeerId): boolean {\r\n return peerId.isUser() && appUsersManager.isBot(peerId.toUserId());\r\n }\r\n\r\n public isContact(peerId: PeerId): boolean {\r\n return peerId.isUser() && appUsersManager.isContact(peerId.toUserId());\r\n }\r\n\r\n public isUser(peerId: PeerId)/* : peerId is UserId */ {\r\n return +peerId >= 0;\r\n }\r\n \r\n public isAnyChat(peerId: PeerId) {\r\n return !this.isUser(peerId);\r\n }\r\n\r\n /* public getInputPeer(peerString: string): InputPeer {\r\n var firstChar = peerString.charAt(0);\r\n var peerParams = peerString.substr(1).split('_');\r\n let id = +peerParams[0];\r\n\r\n if(firstChar === 'u') {\r\n //appUsersManager.saveUserAccess(id, peerParams[1]);\r\n\r\n return {\r\n _: 'inputPeerUser',\r\n user_id: id,\r\n access_hash: peerParams[1]\r\n };\r\n } else if(firstChar === 'c' || firstChar === 's') {\r\n //appChatsManager.saveChannelAccess(id, peerParams[1]);\r\n if(firstChar === 's') {\r\n appChatsManager.saveIsMegagroup(id);\r\n }\r\n\r\n return {\r\n _: 'inputPeerChannel',\r\n channel_id: id,\r\n access_hash: peerParams[1] || '0'\r\n };\r\n } else {\r\n return {\r\n _: 'inputPeerChat',\r\n chat_id: id\r\n };\r\n }\r\n } */\r\n\r\n public getInputNotifyPeerById(peerId: PeerId, ignorePeerId: true): Exclude<InputNotifyPeer, InputNotifyPeer.inputNotifyPeer>;\r\n public getInputNotifyPeerById(peerId: PeerId, ignorePeerId?: false): InputNotifyPeer.inputNotifyPeer;\r\n public getInputNotifyPeerById(peerId: PeerId, ignorePeerId?: boolean): InputNotifyPeer {\r\n if(ignorePeerId) {\r\n if(peerId.isUser()) {\r\n return {_: 'inputNotifyUsers'};\r\n } else {\r\n if(this.isBroadcast(peerId)) {\r\n return {_: 'inputNotifyBroadcasts'};\r\n } else {\r\n return {_: 'inputNotifyChats'};\r\n }\r\n }\r\n } else {\r\n return {\r\n _: 'inputNotifyPeer', \r\n peer: this.getInputPeerById(peerId)\r\n };\r\n }\r\n }\r\n\r\n public getInputPeerById(peerId: PeerId): InputPeer {\r\n if(!peerId) {\r\n return {_: 'inputPeerEmpty'};\r\n }\r\n\r\n if(!peerId.isUser()) {\r\n const chatId = peerId.toChatId();\r\n return appChatsManager.getInputPeer(chatId);\r\n }\r\n\r\n const userId = peerId.toUserId();\r\n return appUsersManager.getUserInputPeer(userId);\r\n }\r\n\r\n public getInputPeerSelf(): InputPeer.inputPeerSelf {\r\n return {_: 'inputPeerSelf'};\r\n }\r\n\r\n public getInputDialogPeerById(peerId: PeerId | InputPeer): InputDialogPeer {\r\n return {\r\n _: 'inputDialogPeer',\r\n peer: isObject<InputPeer>(peerId) ? peerId : this.getInputPeerById(peerId)\r\n };\r\n }\r\n\r\n public getPeerColorById(peerId: PeerId, pic = true) {\r\n if(!peerId) return '';\r\n\r\n const idx = DialogColorsMap[Math.abs(+peerId) % 7];\r\n const color = (pic ? DialogColors : DialogColorsFg)[idx];\r\n return color;\r\n }\r\n\r\n public getPeerSearchText(peerId: PeerId) {\r\n let text: string;\r\n if(this.isUser(peerId)) {\r\n text = '%pu ' + appUsersManager.getUserSearchText(peerId.toUserId());\r\n } else {\r\n const chat = appChatsManager.getChat(peerId.toChatId());\r\n text = '%pg ' + (chat.title || '');\r\n }\r\n\r\n return text;\r\n }\r\n\r\n public getDialogType(peerId: PeerId): PeerType {\r\n if(this.isMegagroup(peerId)) {\r\n return 'megagroup';\r\n } else if(this.isChannel(peerId)) {\r\n return 'channel';\r\n } else if(!this.isUser(peerId)) {\r\n return 'group';\r\n } else {\r\n return peerId === rootScope.myId ? 'saved' : 'chat';\r\n }\r\n }\r\n\r\n public getDeleteButtonText(peerId: PeerId): LangPackKey {\r\n switch(this.getDialogType(peerId)) {\r\n case 'channel':\r\n return appChatsManager.hasRights(peerId.toChatId(), 'delete_chat') ? 'ChannelDelete' : 'ChatList.Context.LeaveChannel';\r\n\r\n case 'megagroup':\r\n case 'group':\r\n return appChatsManager.hasRights(peerId.toChatId(), 'delete_chat') ? 'DeleteMega' : 'ChatList.Context.LeaveGroup';\r\n \r\n default:\r\n return 'ChatList.Context.DeleteChat';\r\n }\r\n }\r\n\r\n public noForwards(peerId: PeerId) {\r\n if(peerId.isUser()) return false;\r\n else {\r\n const chat = appChatsManager.getChatTyped(peerId.toChatId());\r\n return !!(chat as Chat.chat).pFlags?.noforwards;\r\n }\r\n }\r\n}\r\n\r\nexport type IsPeerType = 'isChannel' | 'isMegagroup' | 'isAnyGroup' | 'isBroadcast' | 'isBot' | 'isContact' | 'isUser' | 'isAnyChat';\r\n\r\n[\r\n 'isChannel',\r\n 'isMegagroup',\r\n 'isAnyGroup',\r\n 'isBroadcast',\r\n 'isBot',\r\n 'isContact',\r\n 'isUser',\r\n 'isAnyChat',\r\n].forEach((value) => {\r\n const newMethod = Array.isArray(value) ? value[0] : value;\r\n const originMethod = Array.isArray(value) ? value[1] : value;\r\n // @ts-ignore\r\n String.prototype[newMethod] = function() {\r\n // @ts-ignore\r\n return appPeersManager[originMethod](this.toString());\r\n };\r\n\r\n // @ts-ignore\r\n Number.prototype[newMethod] = function() {\r\n // @ts-ignore\r\n return appPeersManager[originMethod](this);\r\n };\r\n});\r\n\r\ndeclare global {\r\n interface String {\r\n isChannel(): boolean;\r\n isMegagroup(): boolean;\r\n isAnyGroup(): boolean;\r\n isBroadcast(): boolean;\r\n isBot(): boolean;\r\n isContact(): boolean;\r\n isUser(): boolean;\r\n isAnyChat(): boolean;\r\n }\r\n\r\n interface Number {\r\n isChannel(): boolean;\r\n isMegagroup(): boolean;\r\n isAnyGroup(): boolean;\r\n isBroadcast(): boolean;\r\n isBot(): boolean;\r\n isContact(): boolean;\r\n isUser(): boolean;\r\n isAnyChat(): boolean;\r\n }\r\n}\r\n\r\nconst appPeersManager = new AppPeersManager();\r\nMOUNT_CLASS_TO.appPeersManager = appPeersManager;\r\nexport default appPeersManager;\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov <igor.beatle@gmail.com>\n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\nimport { isObject, safeReplaceObject, copy, deepEqual } from \"../../helpers/object\";\nimport { ChannelParticipant, Chat, ChatAdminRights, ChatBannedRights, ChatParticipant, ChatPhoto, InputChannel, InputChatPhoto, InputFile, InputPeer, Update, Updates, ChannelsCreateChannel } from \"../../layer\";\nimport apiManagerProxy from \"../mtproto/mtprotoworker\";\nimport apiManager from '../mtproto/mtprotoworker';\nimport { RichTextProcessor } from \"../richtextprocessor\";\nimport rootScope from \"../rootScope\";\nimport apiUpdatesManager from \"./apiUpdatesManager\";\nimport appPeersManager from \"./appPeersManager\";\nimport appStateManager from \"./appStateManager\";\nimport appUsersManager from \"./appUsersManager\";\n\nexport type Channel = Chat.channel;\nexport type ChatRights = keyof ChatBannedRights['pFlags'] | keyof ChatAdminRights['pFlags'] | 'change_type' | 'change_permissions' | 'delete_chat' | 'view_participants';\n\nexport class AppChatsManager {\n private storage = appStateManager.storages.chats;\n \n private chats: {[id: ChatId]: Chat.channel | Chat.chat | any};\n //private usernames: any;\n //private channelAccess: any;\n //private megagroups: {[id: number]: true};\n\n constructor() {\n this.clear(true);\n\n rootScope.addMultipleEventsListeners({\n /* updateChannel: (update) => {\n const channelId = update.channel_id;\n //console.log('updateChannel:', update);\n rootScope.broadcast('channel_settings', {channelId});\n }, */\n\n updateChannelParticipant: (update) => {\n apiManagerProxy.clearCache('channels.getParticipants', (params) => {\n return (params.channel as InputChannel.inputChannel).channel_id === update.channel_id;\n });\n },\n\n updateChatDefaultBannedRights: (update) => {\n const chatId = appPeersManager.getPeerId(update.peer).toChatId();\n const chat: Chat.chat = this.chats[chatId];\n if(chat) {\n chat.default_banned_rights = update.default_banned_rights;\n rootScope.dispatchEvent('chat_update', chatId);\n }\n }\n });\n\n appStateManager.getState().then((state) => {\n const chats = appStateManager.storagesResults.chats;\n if(chats.length) {\n for(let i = 0, length = chats.length; i < length; ++i) {\n const chat = chats[i];\n if(chat) {\n this.chats[chat.id] = chat;\n }\n }\n }\n\n appStateManager.addEventListener('peerNeeded', (peerId) => {\n if(peerId.isUser() || this.storage.getFromCache(peerId.toChatId())) {\n return;\n }\n\n this.storage.set({\n [peerId.toChatId()]: this.getChat(peerId.toChatId())\n });\n });\n\n appStateManager.addEventListener('peerUnneeded', (peerId) => {\n if(peerId.isUser() || !this.storage.getFromCache(peerId.toChatId())) {\n return;\n }\n\n this.storage.delete(peerId.toChatId());\n });\n });\n }\n\n public clear(init = false) {\n if(!init) {\n const chats = appStateManager.storagesResults.chats;\n for(const chatId in this.chats) {\n if(!chatId) continue;\n if(!appStateManager.isPeerNeeded(chatId.toPeerId(true))) {\n /* const chat = this.chats[chatId];\n if(chat.username) {\n delete this.usernames[cleanUsername(chat.username)];\n } */\n \n chats.findAndSplice((chat) => chat.id === chatId);\n this.storage.delete(chatId);\n delete this.chats[chatId];\n }\n }\n } else {\n this.chats = {};\n }\n }\n\n public saveApiChats(apiChats: any[], override?: boolean) {\n if((apiChats as any).saved) return;\n (apiChats as any).saved = true;\n apiChats.forEach(chat => this.saveApiChat(chat, override));\n }\n\n public saveApiChat(chat: Chat, override?: boolean) {\n if(chat._ === 'chatEmpty') return;\n /* if(chat._ !== 'chat' && chat._ !== 'channel') {\n return;\n } */\n \n // * exclude from state\n // defineNotNumerableProperties(chat, ['rTitle', 'initials']);\n\n const oldChat: Exclude<Chat, Chat.chatEmpty> = this.chats[chat.id];\n\n /* if(oldChat && !override) {\n return;\n } */\n\n if((chat as Chat.chat).pFlags === undefined) {\n (chat as Chat.chat).pFlags = {};\n }\n\n if((chat as Chat.channel).pFlags.min && oldChat !== undefined) {\n return;\n }\n\n chat.initials = RichTextProcessor.getAbbreviation(chat.title);\n\n if(chat._ === 'channel' &&\n chat.participants_count === undefined &&\n oldChat !== undefined &&\n (oldChat as Chat.channel).participants_count) {\n chat.participants_count = (oldChat as Chat.channel).participants_count;\n }\n\n /* if(chat.username) {\n let searchUsername = searchIndexManager.cleanUsername(chat.username);\n this.usernames[searchUsername] = chat.id;\n } */\n\n let changedPhoto = false, changedTitle = false;\n if(oldChat === undefined) {\n this.chats[chat.id] = chat;\n } else {\n const oldPhotoId = ((oldChat as Chat.chat).photo as ChatPhoto.chatPhoto)?.photo_id;\n const newPhotoId = ((chat as Chat.chat).photo as ChatPhoto.chatPhoto)?.photo_id;\n if(oldPhotoId !== newPhotoId) {\n changedPhoto = true;\n }\n\n if(oldChat.title !== chat.title) {\n changedTitle = true;\n }\n\n safeReplaceObject(oldChat, chat);\n rootScope.dispatchEvent('chat_update', chat.id);\n }\n\n const peerId = chat.id.toPeerId(true);\n if(changedPhoto) {\n rootScope.dispatchEvent('avatar_update', peerId);\n }\n\n if(changedTitle) {\n rootScope.dispatchEvent('peer_title_edit', peerId);\n }\n\n if(appStateManager.isPeerNeeded(peerId)) {\n this.storage.set({\n [chat.id]: chat\n });\n }\n }\n\n public getChat(id: ChatId) {\n return this.chats[id] || {_: 'chatEmpty', id, deleted: true, access_hash: '', pFlags: {}/* this.channelAccess[id] */};\n }\n\n public getChatTyped(id: ChatId): Chat {\n return this.getChat(id);\n }\n\n public combineParticipantBannedRights(id: ChatId, rights: ChatBannedRights) {\n const chat: Chat.channel = this.getChat(id);\n\n if(chat.default_banned_rights) {\n rights = copy(rights);\n const defaultRights = chat.default_banned_rights.pFlags;\n for(let i in defaultRights) {\n // @ts-ignore\n rights.pFlags[i] = defaultRights[i];\n }\n }\n\n return rights;\n }\n\n /**\n * Check the user's ability to do an action in chat\n * @param id \n * @param action creator can still send messages to left channel. so this function shows server rights. see canSendToPeer for local rights in messages manager.\n * @param rights do not provide this parameter when checking rights for self\n * @param isThread \n * @returns \n */\n public hasRights(id: ChatId, action: ChatRights, rights?: ChatAdminRights | ChatBannedRights, isThread?: boolean) {\n const chat: Chat = this.getChat(id);\n if(chat._ === 'chatEmpty') return false;\n\n if((chat as Chat.chat).pFlags.deactivated && action !== 'view_messages') {\n return false;\n }\n\n const isCheckingRightsForSelf = rights === undefined;\n if((chat as Chat.chat).pFlags.creator && isCheckingRightsForSelf) {\n return true;\n }\n\n if(chat._ === 'chatForbidden' ||\n chat._ === 'channelForbidden' ||\n (chat as Chat.chat).pFlags.kicked ||\n (chat.pFlags.left && !(chat as Chat.channel).pFlags.megagroup)) {\n return false;\n }\n\n // const adminRights = chat.admin_rights;\n // const bannedRights = (chat as Chat.channel).banned_rights || chat.default_banned_rights;\n\n if(!rights) {\n rights = chat.admin_rights || (chat as Chat.channel).banned_rights || chat.default_banned_rights;\n\n if(!rights) {\n return false;\n }\n }\n\n let myFlags: Partial<{[flag in keyof ChatBannedRights['pFlags'] | keyof ChatAdminRights['pFlags']]: true}> = {};\n if(rights) {\n myFlags = rights.pFlags as any;\n }\n\n // const adminFlags = adminRights?.pFlags || {};\n // const bannedFlags = bannedRights?.pFlags || {};\n\n switch(action) {\n case 'embed_links':\n case 'send_games':\n case 'send_gifs':\n case 'send_inline':\n case 'send_media':\n case 'send_messages':\n case 'send_polls':\n case 'send_stickers': {\n if(!isThread && chat.pFlags.left) {\n return false;\n }\n\n if(rights._ === 'chatBannedRights' && myFlags[action]) {\n return false;\n }\n\n if(chat._ === 'channel') {\n if(!chat.pFlags.megagroup && !myFlags.post_messages) {\n return false;\n }\n }\n\n break;\n }\n\n // * revoke foreign messages\n case 'delete_messages':\n case 'manage_call': {\n return !!myFlags[action];\n }\n\n case 'pin_messages': {\n return rights._ === 'chatAdminRights' ? myFlags[action] || !!myFlags.post_messages : !myFlags[action];\n }\n\n // case 'change_info': {\n // return adminRights || isCheckingRightsForSelf ? adminFlags[action] : !myFlags[action];\n // }\n\n case 'change_info':\n case 'invite_users': {\n return rights._ === 'chatAdminRights' ? myFlags[action] : !myFlags[action];\n }\n\n // * only creator can do that\n case 'change_type':\n case 'delete_chat': {\n return false;\n }\n\n case 'ban_users':\n case 'change_permissions': {\n return rights._ === 'chatAdminRights' && !!myFlags['ban_users'];\n }\n\n case 'view_participants': {\n return !!(chat._ === 'chat' || !chat.pFlags.broadcast || chat.pFlags.creator || chat.admin_rights);\n }\n }\n\n return true;\n }\n\n public editChatDefaultBannedRights(id: ChatId, banned_rights: ChatBannedRights) {\n const chat: Chat.chat = this.getChat(id);\n if(chat.default_banned_rights) {\n if(chat.default_banned_rights.until_date === banned_rights.until_date && deepEqual(chat.default_banned_rights.pFlags, banned_rights.pFlags)) {\n return Promise.resolve();\n }\n }\n \n return apiManager.invokeApi('messages.editChatDefaultBannedRights', {\n peer: appPeersManager.getInputPeerById(id.toPeerId(true)),\n banned_rights\n }).then(this.onChatUpdated.bind(this, id));\n }\n\n /* public resolveUsername(username: string) {\n return this.usernames[username] || 0;\n } */\n\n /* public saveChannelAccess(id: ChatId, accessHash: string) {\n this.channelAccess[id] = accessHash;\n } */\n\n /* public saveIsMegagroup(id: ChatId) {\n this.megagroups[id] = true;\n } */\n\n public isChannel(id: ChatId) {\n const chat = this.chats[id];\n return !!(chat && (chat._ === 'channel' || chat._ === 'channelForbidden')/* || this.channelAccess[id] */);\n }\n\n public isMegagroup(id: ChatId) {\n /* if(this.megagroups[id]) {\n return true;\n } */\n\n const chat: Chat = this.chats[id];\n return !!(chat && chat._ === 'channel' && chat.pFlags.megagroup);\n }\n\n public isBroadcast(id: ChatId) {\n return this.isChannel(id) && !this.isMegagroup(id);\n }\n\n public isInChat(id: ChatId) {\n let good = true;\n const chat: Chat = this.getChat(id);\n if(chat._ === 'channelForbidden' \n || chat._ === 'chatForbidden' \n || chat._ === 'chatEmpty' \n || (chat as Chat.chat).pFlags.left \n || (chat as Chat.chat).pFlags.kicked \n || (chat as Chat.chat).pFlags.deactivated) {\n good = false;\n }\n\n return good;\n }\n\n public getChannelInput(id: ChatId): InputChannel {\n const chat: Chat = this.getChat(id);\n if(chat._ === 'chatEmpty' || !(chat as Chat.channel).access_hash) {\n return {\n _: 'inputChannelEmpty'\n };\n } else {\n return {\n _: 'inputChannel',\n channel_id: id,\n access_hash: (chat as Chat.channel).access_hash/* || this.channelAccess[id] */ || '0'\n };\n }\n }\n\n public getInputPeer(id: ChatId) {\n return this.isChannel(id) ? this.getChannelInputPeer(id) : this.getChatInputPeer(id);\n }\n\n public getChatInputPeer(id: ChatId): InputPeer.inputPeerChat {\n return {\n _: 'inputPeerChat',\n chat_id: id\n };\n }\n\n public getChannelInputPeer(id: ChatId): InputPeer.inputPeerChannel {\n return {\n _: 'inputPeerChannel',\n channel_id: id,\n access_hash: this.getChat(id).access_hash/* || this.channelAccess[id] */ || 0\n };\n }\n\n public hasChat(id: ChatId, allowMin?: true) {\n const chat = this.chats[id];\n return isObject(chat) && (allowMin || !chat.pFlags.min);\n }\n\n public getChatPhoto(id: ChatId) {\n const chat: Chat.chat = this.getChat(id);\n\n return chat && chat.photo || {\n _: 'chatPhotoEmpty'\n };\n }\n\n public getChatString(id: ChatId) {\n const chat = this.getChat(id);\n if(this.isChannel(id)) {\n return (this.isMegagroup(id) ? 's' : 'c') + id + '_' + chat.access_hash;\n }\n return 'g' + id;\n }\n\n /* public wrapForFull(id: number, fullChat: any) {\n const chatFull = copy(fullChat);\n const chat = this.getChat(id);\n\n if(!chatFull.participants_count) {\n chatFull.participants_count = chat.participants_count;\n }\n\n if(chatFull.participants &&\n chatFull.participants._ === 'chatParticipants') {\n chatFull.participants.participants = this.wrapParticipants(id, chatFull.participants.participants);\n }\n\n if(chatFull.about) {\n chatFull.rAbout = RichTextProcessor.wrapRichText(chatFull.about, {noLinebreaks: true});\n }\n\n //chatFull.peerString = this.getChatString(id);\n chatFull.chat = chat;\n\n return chatFull;\n }\n\n public wrapParticipants(id: number, participants: any[]) {\n const chat = this.getChat(id);\n const myId = appUsersManager.getSelf().id;\n if(this.isChannel(id)) {\n const isAdmin = chat.pFlags.creator;\n participants.forEach((participant) => {\n participant.canLeave = myId === participant.user_id;\n participant.canKick = isAdmin && participant._ === 'channelParticipant';\n\n // just for order by last seen\n participant.user = appUsersManager.getUser(participant.user_id);\n });\n } else {\n const isAdmin = chat.pFlags.creator || chat.pFlags.admins_enabled && chat.pFlags.admin;\n participants.forEach((participant) => {\n participant.canLeave = myId === participant.user_id;\n participant.canKick = !participant.canLeave && (\n chat.pFlags.creator ||\n participant._ === 'chatParticipant' && (isAdmin || myId === participant.inviter_id)\n );\n\n // just for order by last seen\n participant.user = appUsersManager.getUser(participant.user_id);\n });\n }\n\n return participants;\n } */\n\n public createChannel(options: ChannelsCreateChannel): Promise<ChatId> {\n return apiManager.invokeApi('channels.createChannel', options).then((updates) => {\n apiUpdatesManager.processUpdateMessage(updates);\n\n const channelId = (updates as any).chats[0].id;\n rootScope.dispatchEvent('history_focus', {peerId: channelId.toPeerId(true)});\n\n return channelId;\n });\n }\n\n public inviteToChannel(id: ChatId, userIds: UserId[]) {\n const input = this.getChannelInput(id);\n const usersInputs = userIds.map(u => appUsersManager.getUserInput(u));\n\n return apiManager.invokeApi('channels.inviteToChannel', {\n channel: input,\n users: usersInputs\n }).then(this.onChatUpdated.bind(this, id));\n }\n\n public createChat(title: string, userIds: UserId[]): Promise<ChatId> {\n return apiManager.invokeApi('messages.createChat', {\n users: userIds.map(u => appUsersManager.getUserInput(u)),\n title\n }).then(updates => {\n apiUpdatesManager.processUpdateMessage(updates);\n\n const chatId = (updates as any as Updates.updates).chats[0].id;\n rootScope.dispatchEvent('history_focus', {peerId: chatId.toPeerId(true)});\n\n return chatId;\n });\n }\n\n private onChatUpdated = (chatId: ChatId, updates?: any) => {\n //console.log('onChatUpdated', chatId, updates);\n\n apiUpdatesManager.processUpdateMessage(updates);\n if(updates?.updates?.length && this.isChannel(chatId)) {\n rootScope.dispatchEvent('invalidate_participants', chatId);\n }\n };\n\n public leaveChannel(id: ChatId) {\n return apiManager.invokeApi('channels.leaveChannel', {\n channel: this.getChannelInput(id)\n }).then(this.onChatUpdated.bind(this, id));\n }\n\n public joinChannel(id: ChatId) {\n return apiManager.invokeApi('channels.joinChannel', {\n channel: this.getChannelInput(id)\n }).then(this.onChatUpdated.bind(this, id));\n }\n\n public addChatUser(id: ChatId, userId: UserId, fwdLimit = 100) {\n return apiManager.invokeApi('messages.addChatUser', {\n chat_id: id,\n user_id: appUsersManager.getUserInput(userId),\n fwd_limit: fwdLimit\n }).then(this.onChatUpdated.bind(this, id));\n }\n\n public deleteChatUser(id: ChatId, userId: UserId) {\n return apiManager.invokeApi('messages.deleteChatUser', {\n chat_id: id,\n user_id: appUsersManager.getUserInput(userId)\n }).then(this.onChatUpdated.bind(this, id));\n }\n\n public leaveChat(id: ChatId) {\n return this.deleteChatUser(id, appUsersManager.getSelf().id);\n }\n\n public leave(id: ChatId) {\n return this.isChannel(id) ? this.leaveChannel(id) : this.leaveChat(id);\n }\n\n public delete(id: ChatId) {\n return this.isChannel(id) ? this.deleteChannel(id) : this.deleteChat(id);\n }\n\n public deleteChannel(id: ChatId) {\n return apiManager.invokeApi('channels.deleteChannel', {\n channel: this.getChannelInput(id)\n }).then(this.onChatUpdated.bind(this, id));\n }\n\n public deleteChat(id: ChatId) {\n //return this.leaveChat(id).then(() => {\n return apiManager.invokeApi('messages.deleteChat', {\n chat_id: id\n });\n //});\n }\n\n public migrateChat(id: ChatId): Promise<ChatId> {\n const chat: Chat = this.getChat(id);\n if(chat._ === 'channel') return Promise.resolve(chat.id);\n return apiManager.invokeApi('messages.migrateChat', {\n chat_id: id\n }).then((updates) => {\n this.onChatUpdated(id, updates);\n const update: Update.updateChannel = (updates as Updates.updates).updates.find(u => u._ === 'updateChannel') as any;\n return update.channel_id;\n });\n }\n\n public updateUsername(id: ChatId, username: string) {\n return apiManager.invokeApi('channels.updateUsername', {\n channel: this.getChannelInput(id),\n username\n }).then((bool) => {\n if(bool) {\n const chat: Chat.channel = this.getChat(id);\n chat.username = username;\n }\n\n return bool;\n });\n }\n\n public editPhoto(id: ChatId, inputFile: InputFile) {\n const inputChatPhoto: InputChatPhoto = {\n _: 'inputChatUploadedPhoto',\n file: inputFile\n };\n\n let promise: any;\n if(this.isChannel(id)) {\n promise = apiManager.invokeApi('channels.editPhoto', {\n channel: this.getChannelInput(id),\n photo: inputChatPhoto\n });\n } else {\n promise = apiManager.invokeApi('messages.editChatPhoto', {\n chat_id: id,\n photo: inputChatPhoto\n });\n }\n\n return promise.then((updates: any) => {\n apiUpdatesManager.processUpdateMessage(updates);\n });\n }\n\n public editTitle(id: ChatId, title: string) {\n let promise: any;\n\n if(this.isChannel(id)) {\n promise = apiManager.invokeApi('channels.editTitle', {\n channel: this.getChannelInput(id),\n title\n });\n } else {\n promise = apiManager.invokeApi('messages.editChatTitle', {\n chat_id: id,\n title\n });\n }\n\n return promise.then((updates: any) => {\n apiUpdatesManager.processUpdateMessage(updates);\n });\n }\n\n public editAbout(id: ChatId, about: string) {\n const peerId = id.toPeerId(true);\n return apiManager.invokeApi('messages.editChatAbout', {\n peer: appPeersManager.getInputPeerById(peerId),\n about\n }).then(bool => {\n if(bool) {\n rootScope.dispatchEvent('peer_bio_edit', peerId);\n }\n\n return bool;\n });\n }\n\n public getParticipantPeerId(participant: ChannelParticipant | ChatParticipant): PeerId {\n const peerId = (participant as ChannelParticipant.channelParticipantBanned).peer ? \n appPeersManager.getPeerId((participant as ChannelParticipant.channelParticipantBanned).peer) : \n (participant as ChatParticipant.chatParticipant).user_id.toPeerId();\n return peerId;\n }\n\n public editBanned(id: ChatId, participant: PeerId | ChannelParticipant, banned_rights: ChatBannedRights) {\n const peerId = typeof(participant) !== 'object' ? participant : this.getParticipantPeerId(participant);\n return apiManager.invokeApi('channels.editBanned', {\n channel: this.getChannelInput(id),\n participant: appPeersManager.getInputPeerById(peerId),\n banned_rights\n }).then((updates) => {\n this.onChatUpdated(id, updates);\n\n if(typeof(participant) === 'object') {\n const timestamp = Date.now() / 1000 | 0;\n apiUpdatesManager.processLocalUpdate({\n _: 'updateChannelParticipant',\n channel_id: id,\n date: timestamp,\n actor_id: undefined,\n qts: undefined,\n user_id: peerId,\n prev_participant: participant,\n new_participant: Object.keys(banned_rights.pFlags).length ? {\n _: 'channelParticipantBanned',\n date: timestamp,\n banned_rights,\n kicked_by: appUsersManager.getSelf().id,\n peer: appPeersManager.getOutputPeer(peerId),\n pFlags: {}\n } : undefined\n });\n }\n });\n }\n\n public clearChannelParticipantBannedRights(id: ChatId, participant: PeerId | ChannelParticipant) {\n return this.editBanned(id, participant, {\n _: 'chatBannedRights',\n until_date: 0,\n pFlags: {}\n });\n }\n \n public kickFromChannel(id: ChatId, participant: PeerId | ChannelParticipant) {\n return this.editBanned(id, participant, {\n _: 'chatBannedRights',\n until_date: 0,\n pFlags: {\n view_messages: true\n }\n });\n }\n\n public kickFromChat(id: ChatId, participant: PeerId | ChannelParticipant) {\n if(this.isChannel(id)) return this.kickFromChannel(id, participant);\n else return this.deleteChatUser(id, (participant as PeerId).toUserId());\n }\n\n public resolveChannel(id: ChatId) {\n return apiManager.invokeApiSingle('channels.getChannels', {\n id: [{\n _: 'inputChannel',\n channel_id: id,\n access_hash: '0'\n }]\n }).then(messagesChats => {\n this.saveApiChats(messagesChats.chats);\n });\n }\n\n public togglePreHistoryHidden(id: ChatId, enabled: boolean) {\n return this.migrateChat(id).then(channelId => {\n return apiManager.invokeApi('channels.togglePreHistoryHidden', {\n channel: this.getChannelInput(channelId),\n enabled\n });\n }).then(updates => {\n apiUpdatesManager.processUpdateMessage(updates);\n });\n }\n\n public toggleSignatures(id: ChatId, enabled: boolean) {\n return apiManager.invokeApi('channels.toggleSignatures', {\n channel: this.getChannelInput(id),\n enabled\n }).then(updates => {\n apiUpdatesManager.processUpdateMessage(updates);\n });\n }\n\n public toggleNoForwards(id: ChatId, enabled: boolean) {\n return apiManager.invokeApi('messages.toggleNoForwards', {\n peer: this.getInputPeer(id),\n enabled\n }).then(updates => {\n apiUpdatesManager.processUpdateMessage(updates);\n });\n }\n}\n\nconst appChatsManager = new AppChatsManager();\nMOUNT_CLASS_TO.appChatsManager = appChatsManager;\nexport default appChatsManager;\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport appPeersManager from \"../lib/appManagers/appPeersManager\";\r\nimport rootScope from \"../lib/rootScope\";\r\nimport { i18n } from \"../lib/langPack\";\r\nimport replaceContent from \"../helpers/dom/replaceContent\";\r\nimport appUsersManager from \"../lib/appManagers/appUsersManager\";\r\nimport RichTextProcessor from \"../lib/richtextprocessor\";\r\nimport { NULL_PEER_ID } from \"../lib/mtproto/mtproto_config\";\r\n\r\nexport type PeerTitleOptions = {\r\n peerId?: PeerId,\r\n fromName?: string,\r\n plainText?: boolean,\r\n onlyFirstName?: boolean,\r\n dialog?: boolean\r\n};\r\n\r\nconst weakMap: WeakMap<HTMLElement, PeerTitle> = new WeakMap();\r\n\r\nMOUNT_CLASS_TO.peerTitleWeakMap = weakMap;\r\n\r\nrootScope.addEventListener('peer_title_edit', (peerId) => {\r\n const elements = Array.from(document.querySelectorAll(`.peer-title[data-peer-id=\"${peerId}\"]`)) as HTMLElement[];\r\n elements.forEach(element => {\r\n const peerTitle = weakMap.get(element);\r\n //console.log('in the summer silence i was doing nothing', peerTitle, peerId);\r\n\r\n if(peerTitle) {\r\n peerTitle.update();\r\n }\r\n });\r\n});\r\n\r\nexport default class PeerTitle {\r\n public element: HTMLElement;\r\n public peerId: PeerId;\r\n public fromName: string;\r\n public plainText = false;\r\n public onlyFirstName = false;\r\n public dialog = false;\r\n\r\n constructor(options: PeerTitleOptions) {\r\n this.element = document.createElement('span');\r\n this.element.classList.add('peer-title');\r\n this.element.setAttribute('dir', 'auto');\r\n \r\n this.update(options);\r\n weakMap.set(this.element, this);\r\n }\r\n\r\n public update(options?: PeerTitleOptions) {\r\n if(options) {\r\n for(let i in options) {\r\n // @ts-ignore\r\n this.element.dataset[i] = options[i] ? '' + (typeof(options[i]) === 'boolean' ? +options[i] : options[i]) : '0';\r\n // @ts-ignore\r\n this[i] = options[i];\r\n }\r\n }\r\n\r\n if(this.fromName !== undefined) {\r\n this.element.innerHTML = RichTextProcessor.wrapEmojiText(this.fromName);\r\n return;\r\n }\r\n\r\n if(this.peerId === undefined) {\r\n this.peerId = NULL_PEER_ID;\r\n }\r\n\r\n if(this.peerId !== rootScope.myId || !this.dialog) {\r\n if(this.peerId.isUser() && appUsersManager.getUser(this.peerId).pFlags.deleted) {\r\n replaceContent(this.element, i18n(this.onlyFirstName ? 'Deleted' : 'HiddenName'));\r\n } else {\r\n this.element.innerHTML = appPeersManager.getPeerTitle(this.peerId, this.plainText, this.onlyFirstName);\r\n }\r\n } else {\r\n replaceContent(this.element, i18n(this.onlyFirstName ? 'Saved' : 'SavedMessages'));\r\n }\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov <igor.beatle@gmail.com>\n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport type { DownloadOptions } from \"../mtproto/apiFileManager\";\nimport { bytesFromHex } from \"../../helpers/bytes\";\nimport { CancellablePromise } from \"../../helpers/cancellablePromise\";\nimport { getFileNameByLocation } from \"../../helpers/fileName\";\nimport { safeReplaceArrayInObject, isObject } from \"../../helpers/object\";\nimport { IS_SAFARI } from \"../../environment/userAgent\";\nimport { InputFileLocation, InputMedia, InputPhoto, Photo, PhotoSize, PhotosPhotos } from \"../../layer\";\nimport apiManager from \"../mtproto/mtprotoworker\";\nimport referenceDatabase, { ReferenceContext } from \"../mtproto/referenceDatabase\";\nimport { MyDocument } from \"./appDocsManager\";\nimport appDownloadManager, { ThumbCache } from \"./appDownloadManager\";\nimport appUsersManager from \"./appUsersManager\";\nimport blur from \"../../helpers/blur\";\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\nimport { renderImageFromUrlPromise } from \"../../helpers/dom/renderImageFromUrl\";\nimport calcImageInBox from \"../../helpers/calcImageInBox\";\nimport { makeMediaSize, MediaSize } from \"../../helpers/mediaSizes\";\nimport windowSize from \"../../helpers/windowSize\";\n\nexport type MyPhoto = Photo.photo;\n\n// TIMES = 2 DUE TO SIDEBAR AND CHAT\n//let TEST_FILE_REFERENCE = \"5440692274120994569\", TEST_FILE_REFERENCE_TIMES = 2;\n\nexport class AppPhotosManager {\n private photos: {\n [id: string]: MyPhoto\n } = {};\n\n private static jpegHeader = bytesFromHex('ffd8ffe000104a46494600010100000100010000ffdb004300281c1e231e19282321232d2b28303c64413c37373c7b585d4964918099968f808c8aa0b4e6c3a0aadaad8a8cc8ffcbdaeef5ffffff9bc1fffffffaffe6fdfff8ffdb0043012b2d2d3c353c76414176f8a58ca5f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8ffc00011080000000003012200021101031101ffc4001f0000010501010101010100000000000000000102030405060708090a0bffc400b5100002010303020403050504040000017d01020300041105122131410613516107227114328191a1082342b1c11552d1f02433627282090a161718191a25262728292a3435363738393a434445464748494a535455565758595a636465666768696a737475767778797a838485868788898a92939495969798999aa2a3a4a5a6a7a8a9aab2b3b4b5b6b7b8b9bac2c3c4c5c6c7c8c9cad2d3d4d5d6d7d8d9dae1e2e3e4e5e6e7e8e9eaf1f2f3f4f5f6f7f8f9faffc4001f0100030101010101010101010000000000000102030405060708090a0bffc400b51100020102040403040705040400010277000102031104052131061241510761711322328108144291a1b1c109233352f0156272d10a162434e125f11718191a262728292a35363738393a434445464748494a535455565758595a636465666768696a737475767778797a82838485868788898a92939495969798999aa2a3a4a5a6a7a8a9aab2b3b4b5b6b7b8b9bac2c3c4c5c6c7c8c9cad2d3d4d5d6d7d8d9dae2e3e4e5e6e7e8e9eaf2f3f4f5f6f7f8f9faffda000c03010002110311003f00');\n private static jpegTail = bytesFromHex('ffd9');\n \n public savePhoto(photo: Photo, context?: ReferenceContext) {\n if(photo._ === 'photoEmpty') return undefined;\n\n /* if(photo.id === TEST_FILE_REFERENCE) {\n console.warn('Testing FILE_REFERENCE_EXPIRED');\n const bytes = [2, 67, 175, 43, 190, 0, 0, 20, 62, 95, 111, 33, 45, 99, 220, 116, 218, 11, 167, 127, 213, 18, 127, 32, 243, 202, 117, 80, 30];\n //photo.file_reference = new Uint8Array(bytes);\n photo.file_reference = bytes;\n if(!--TEST_FILE_REFERENCE_TIMES) {\n TEST_FILE_REFERENCE = '';\n }\n } */\n\n const oldPhoto = this.photos[photo.id];\n if(photo.file_reference) { // * because we can have a new object w/o the file_reference while sending\n safeReplaceArrayInObject('file_reference', oldPhoto, photo);\n referenceDatabase.saveContext(photo.file_reference, context);\n }\n\n if(photo.sizes?.length) {\n const size = photo.sizes[photo.sizes.length - 1];\n if(size._ === 'photoSizeProgressive') {\n size.size = size.sizes[size.sizes.length - 1];\n }\n }\n\n if(oldPhoto) {\n return Object.assign(oldPhoto, photo);\n }\n\n return this.photos[photo.id] = photo;\n }\n \n public choosePhotoSize(photo: MyPhoto | MyDocument, boxWidth = 0, boxHeight = 0, useBytes = false, pushDocumentSize = false) {\n if(window.devicePixelRatio > 1) {\n boxWidth *= 2;\n boxHeight *= 2;\n }\n \n /*\n s\tbox\t100x100\n m\tbox\t320x320\n x\tbox\t800x800\n y\tbox\t1280x1280\n w\tbox\t2560x2560\n a\tcrop\t160x160\n b\tcrop\t320x320\n c\tcrop\t640x640\n d\tcrop\t1280x1280 */\n\n let bestPhotoSize: PhotoSize = {_: 'photoSizeEmpty', type: ''};\n let sizes = (photo as MyPhoto).sizes || (photo as MyDocument).thumbs as PhotoSize[];\n if(pushDocumentSize && sizes && photo._ === 'document') {\n sizes = sizes.concat({\n _: 'photoSize', \n w: (photo as MyDocument).w, \n h: (photo as MyDocument).h, \n size: (photo as MyDocument).size, \n type: undefined\n });\n }\n\n if(sizes?.length) {\n for(let i = 0, length = sizes.length; i < length; ++i) {\n const photoSize = sizes[i];\n if(!('w' in photoSize) && !('h' in photoSize)) continue;\n \n bestPhotoSize = photoSize;\n \n const size = calcImageInBox(photoSize.w, photoSize.h, boxWidth, boxHeight);\n if(size.width >= boxWidth || size.height >= boxHeight) {\n break;\n }\n }\n\n if(useBytes && bestPhotoSize._ === 'photoSizeEmpty' && sizes[0]._ === 'photoStrippedSize') {\n bestPhotoSize = sizes[0];\n }\n }\n \n return bestPhotoSize;\n }\n \n public getUserPhotos(userId: UserId, maxId: Photo.photo['id'] = '0', limit: number = 20) {\n const inputUser = appUsersManager.getUserInput(userId);\n return apiManager.invokeApiCacheable('photos.getUserPhotos', {\n user_id: inputUser,\n offset: 0,\n limit,\n max_id: maxId\n }, {cacheSeconds: 60}).then((photosResult) => {\n appUsersManager.saveApiUsers(photosResult.users);\n const photoIds = photosResult.photos.map((photo, idx) => {\n photosResult.photos[idx] = this.savePhoto(photo, {type: 'profilePhoto', peerId: userId.toPeerId()});\n return photo.id;\n });\n\n // ! WARNING !\n if(maxId !== '0' && maxId) {\n const idx = photoIds.indexOf(maxId);\n if(idx !== -1) {\n photoIds.splice(idx, 1);\n }\n }\n \n return {\n count: (photosResult as PhotosPhotos.photosPhotosSlice).count || photoIds.length,\n photos: photoIds\n };\n });\n }\n\n public getPreviewURLFromBytes(bytes: Uint8Array | number[], isSticker = false) {\n let arr: Uint8Array;\n if(!isSticker) {\n arr = new Uint8Array(AppPhotosManager.jpegHeader.concat(Array.from(bytes.slice(3)), AppPhotosManager.jpegTail));\n arr[164] = bytes[1];\n arr[166] = bytes[2];\n } else {\n arr = bytes instanceof Uint8Array ? bytes : new Uint8Array(bytes);\n }\n\n let mimeType: string;\n if(isSticker) {\n mimeType = IS_SAFARI ? 'image/png' : 'image/webp';\n } else {\n mimeType = 'image/jpeg';\n }\n\n const blob = new Blob([arr], {type: mimeType});\n return URL.createObjectURL(blob);\n }\n\n /**\n * https://core.telegram.org/api/files#vector-thumbnails\n */\n public getPathFromPhotoPathSize(size: PhotoSize.photoPathSize) {\n const bytes = size.bytes;\n const lookup = \"AACAAAAHAAALMAAAQASTAVAAAZaacaaaahaaalmaaaqastava.az0123456789-,\";\n\n let path = 'M';\n for(let i = 0, length = bytes.length; i < length; ++i) {\n const num = bytes[i];\n\n if(num >= (128 + 64)) {\n path += lookup[num - 128 - 64];\n } else {\n if(num >= 128) {\n path += ',';\n } else if(num >= 64) {\n path += '-'; \n }\n path += '' + (num & 63);\n }\n }\n path += 'z';\n\n return path;\n }\n\n public getPreviewURLFromThumb(photo: MyPhoto | MyDocument, thumb: PhotoSize.photoCachedSize | PhotoSize.photoStrippedSize, isSticker = false) {\n const cacheContext = appDownloadManager.getCacheContext(photo, thumb.type);\n return cacheContext.url || (cacheContext.url = this.getPreviewURLFromBytes(thumb.bytes, isSticker));\n }\n \n public getImageFromStrippedThumb(photo: MyPhoto | MyDocument, thumb: PhotoSize.photoCachedSize | PhotoSize.photoStrippedSize, useBlur: boolean) {\n const url = this.getPreviewURLFromThumb(photo, thumb, false);\n\n const image = new Image();\n image.classList.add('thumbnail');\n\n const loadPromise = (useBlur ? blur(url) : Promise.resolve(url)).then(url => {\n return renderImageFromUrlPromise(image, url);\n });\n \n return {image, loadPromise};\n }\n \n public setAttachmentSize(\n photo: MyPhoto | MyDocument, \n element: HTMLElement | SVGForeignObjectElement, \n boxWidth: number, \n boxHeight: number, \n noZoom = true, \n message?: any,\n pushDocumentSize?: boolean,\n photoSize?: ReturnType<AppPhotosManager['choosePhotoSize']>\n ) {\n if(!photoSize) {\n photoSize = this.choosePhotoSize(photo, boxWidth, boxHeight, undefined, pushDocumentSize);\n }\n //console.log('setAttachmentSize', photo, photo.sizes[0].bytes, div);\n \n let size: MediaSize;\n const isDocument = photo._ === 'document';\n if(isDocument) {\n size = makeMediaSize((photo as MyDocument).w || (photoSize as PhotoSize.photoSize).w || 512, (photo as MyDocument).h || (photoSize as PhotoSize.photoSize).h || 512);\n } else {\n size = makeMediaSize((photoSize as PhotoSize.photoSize).w || 100, (photoSize as PhotoSize.photoSize).h || 100);\n }\n\n let boxSize = makeMediaSize(boxWidth, boxHeight);\n\n boxSize = size = size.aspect(boxSize, noZoom);\n\n let isFit = true;\n\n if(!isDocument || ['video', 'gif'].includes((photo as MyDocument).type)) {\n if(boxSize.width < 200 && boxSize.height < 200) { // make at least one side this big\n boxSize = size = size.aspectCovered(makeMediaSize(200, 200));\n }\n \n if(message && \n (message.message || \n message.reply_to_mid || \n message.media.webpage || \n (message.replies && message.replies.pFlags.comments && message.replies.channel_id !== 777)\n )\n ) { // make sure that bubble block is human-readable\n if(boxSize.width < 320) {\n boxSize = makeMediaSize(320, boxSize.height);\n isFit = false;\n }\n }\n \n if(isFit && boxSize.width < 120 && message) { // if image is too narrow\n boxSize = makeMediaSize(120, boxSize.height);\n isFit = false;\n }\n }\n\n // if(element instanceof SVGForeignObjectElement) {\n // element.setAttributeNS(null, 'width', '' + w);\n // element.setAttributeNS(null, 'height', '' + h);\n\n // //console.log('set dimensions to svg element:', element, w, h);\n // } else {\n element.style.width = boxSize.width + 'px';\n element.style.height = boxSize.height + 'px';\n // }\n \n return {photoSize, size, isFit};\n }\n\n public getStrippedThumbIfNeeded(photo: MyPhoto | MyDocument, cacheContext: ThumbCache, useBlur: boolean, ignoreCache = false): ReturnType<AppPhotosManager['getImageFromStrippedThumb']> {\n if(!cacheContext.downloaded || (['video', 'gif'] as MyDocument['type'][]).includes((photo as MyDocument).type) || ignoreCache) {\n if(photo._ === 'document' && cacheContext.downloaded && !ignoreCache) {\n return null;\n }\n\n const sizes = (photo as MyPhoto).sizes || (photo as MyDocument).thumbs;\n const thumb = sizes?.length ? sizes.find(size => size._ === 'photoStrippedSize') : null;\n if(thumb && ('bytes' in thumb)) {\n return this.getImageFromStrippedThumb(photo, thumb as any, useBlur);\n }\n }\n\n return null;\n }\n \n public getPhotoDownloadOptions(photo: MyPhoto | MyDocument, photoSize: PhotoSize, queueId?: number, onlyCache?: boolean): DownloadOptions {\n const isDocument = photo._ === 'document';\n\n if(!photoSize || photoSize._ === 'photoSizeEmpty') {\n //console.error('no photoSize by photo:', photo);\n throw new Error('photoSizeEmpty!');\n }\n \n // maybe it's a thumb\n const isPhoto = (photoSize._ === 'photoSize' || photoSize._ === 'photoSizeProgressive') && photo.access_hash && photo.file_reference;\n const location: InputFileLocation.inputPhotoFileLocation | InputFileLocation.inputDocumentFileLocation = {\n _: isDocument ? 'inputDocumentFileLocation' : 'inputPhotoFileLocation',\n id: photo.id,\n access_hash: photo.access_hash,\n file_reference: photo.file_reference,\n thumb_size: photoSize.type\n };\n\n return {\n dcId: photo.dc_id, \n location, \n size: isPhoto ? (photoSize as PhotoSize.photoSize).size : undefined, \n queueId, \n onlyCache\n };\n }\n\n /* public getPhotoURL(photo: MTPhoto | MTMyDocument, photoSize: MTPhotoSize) {\n const downloadOptions = this.getPhotoDownloadOptions(photo, photoSize);\n\n return {url: getFileURL('photo', downloadOptions), location: downloadOptions.location};\n } */\n\n /* public isDownloaded(media: any) {\n const isPhoto = media._ === 'photo';\n const photo = isPhoto ? this.getPhoto(media.id) : null;\n let isDownloaded: boolean;\n if(photo) {\n isDownloaded = photo.downloaded > 0;\n } else {\n const cachedThumb = this.getDocumentCachedThumb(media.id);\n isDownloaded = cachedThumb?.downloaded > 0;\n }\n\n return isDownloaded;\n } */\n \n public preloadPhoto(photoId: MyPhoto | MyDocument | string, photoSize?: PhotoSize, queueId?: number, onlyCache?: boolean): CancellablePromise<Blob> {\n const photo = this.getPhoto(photoId);\n\n // @ts-ignore\n if(!photo || photo._ === 'photoEmpty') {\n throw new Error('preloadPhoto photoEmpty!');\n }\n\n if(!photoSize) {\n const fullWidth = windowSize.width;\n const fullHeight = windowSize.height;\n \n photoSize = this.choosePhotoSize(photo, fullWidth, fullHeight);\n }\n\n const cacheContext = appDownloadManager.getCacheContext(photo, photoSize.type);\n if(cacheContext.downloaded >= ('size' in photoSize ? photoSize.size : 0) && cacheContext.url) {\n return Promise.resolve() as any;\n }\n \n const downloadOptions = this.getPhotoDownloadOptions(photo, photoSize, queueId, onlyCache);\n const fileName = getFileNameByLocation(downloadOptions.location);\n\n let download = appDownloadManager.getDownload(fileName);\n if(download) {\n return download;\n }\n\n download = appDownloadManager.download(downloadOptions);\n download.then(blob => {\n if(!cacheContext.downloaded || cacheContext.downloaded < blob.size) {\n const url = URL.createObjectURL(blob);\n cacheContext.downloaded = blob.size;\n cacheContext.url = url;\n\n //console.log('wrote photo:', photo, photoSize, cacheContext, blob);\n }\n\n return blob;\n }).catch(() => {});\n\n return download;\n }\n \n public getPhoto(photoId: any/* MyPhoto | string */): MyPhoto {\n return isObject(photoId) ? photoId as MyPhoto : this.photos[photoId as any as string];\n }\n\n public getInput(photo: MyPhoto): InputPhoto.inputPhoto {\n return {\n _: 'inputPhoto',\n id: photo.id,\n access_hash: photo.access_hash,\n file_reference: photo.file_reference\n };\n }\n\n public getMediaInput(photo: MyPhoto): InputMedia.inputMediaPhoto {\n return {\n _: 'inputMediaPhoto',\n id: this.getInput(photo),\n ttl_seconds: 0\n };\n }\n\n public savePhotoFile(photo: MyPhoto | MyDocument, queueId?: number) {\n const fullPhotoSize = this.choosePhotoSize(photo, 0xFFFF, 0xFFFF);\n if(!(fullPhotoSize._ === 'photoSize' || fullPhotoSize._ === 'photoSizeProgressive')) {\n return;\n }\n\n const downloadOptions = this.getPhotoDownloadOptions(photo, fullPhotoSize, queueId);\n downloadOptions.fileName = 'photo' + photo.id + '.jpg';\n appDownloadManager.downloadToDisc(downloadOptions, downloadOptions.fileName);\n }\n}\n\nconst appPhotosManager = new AppPhotosManager();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.appPhotosManager = appPhotosManager);\nexport default appPhotosManager;\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov <igor.beatle@gmail.com>\r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nexport function bytesToHex(bytes: ArrayLike<number>) {\r\n const length = bytes.length;\r\n const arr: string[] = new Array(length);\r\n for(let i = 0; i < length; ++i) {\r\n arr[i] = (bytes[i] < 16 ? '0' : '') + (bytes[i] || 0).toString(16);\r\n }\r\n return arr.join('');\r\n}\r\n\r\nexport function bytesFromHex(hexString: string) {\r\n const len = hexString.length;\r\n const bytes = new Uint8Array(Math.ceil(len / 2));\r\n let start = 0;\r\n\r\n if(len % 2) { // read 0x581 as 0x0581\r\n bytes[start++] = parseInt(hexString.charAt(0), 16);\r\n }\r\n\r\n for(let i = start; i < len; i += 2) {\r\n bytes[start++] = parseInt(hexString.substr(i, 2), 16);\r\n }\r\n\r\n return bytes;\r\n}\r\n\r\nexport function bytesToBase64(bytes: number[] | Uint8Array) {\r\n let mod3: number;\r\n let result = '';\r\n\r\n for(let nLen = bytes.length, nUint24 = 0, nIdx = 0; nIdx < nLen; ++nIdx) {\r\n mod3 = nIdx % 3;\r\n nUint24 |= bytes[nIdx] << (16 >>> mod3 & 24);\r\n if(mod3 === 2 || nLen - nIdx === 1) {\r\n result += String.fromCharCode(\r\n uint6ToBase64(nUint24 >>> 18 & 63),\r\n uint6ToBase64(nUint24 >>> 12 & 63),\r\n uint6ToBase64(nUint24 >>> 6 & 63),\r\n uint6ToBase64(nUint24 & 63)\r\n );\r\n nUint24 = 0;\r\n }\r\n }\r\n\r\n return result.replace(/A(?=A$|$)/g, '=');\r\n}\r\n\r\nexport function uint6ToBase64(nUint6: number) {\r\n return nUint6 < 26\r\n ? nUint6 + 65\r\n : nUint6 < 52\r\n ? nUint6 + 71\r\n : nUint6 < 62\r\n ? nUint6 - 4\r\n : nUint6 === 62\r\n ? 43\r\n : nUint6 === 63\r\n ? 47\r\n : 65;\r\n}\r\n\r\nexport function bytesCmp(bytes1: number[] | Uint8Array, bytes2: number[] | Uint8Array) {\r\n const len = bytes1.length;\r\n if(len !== bytes2.length) {\r\n return false;\r\n }\r\n\r\n for(let i = 0; i < len; ++i) {\r\n if(bytes1[i] !== bytes2[i]) {\r\n return false;\r\n }\r\n }\r\n\r\n return true;\r\n}\r\n\r\nexport function bytesXor(bytes1: Uint8Array, bytes2: Uint8Array) {\r\n const len = bytes1.length;\r\n const bytes = new Uint8Array(len);\r\n\r\n for(let i = 0; i < len; ++i) {\r\n bytes[i] = bytes1[i] ^ bytes2[i];\r\n }\r\n\r\n return bytes;\r\n}\r\n\r\n/* export function bytesToArrayBuffer(b: number[]) {\r\n return (new Uint8Array(b)).buffer;\r\n}\r\n\r\nexport function convertToArrayBuffer(bytes: any | ArrayBuffer | Uint8Array) {\r\n // Be careful with converting subarrays!!\r\n if(bytes instanceof ArrayBuffer) {\r\n return bytes;\r\n }\r\n if(bytes.buffer !== undefined &&\r\n bytes.buffer.byteLength === bytes.length * bytes.BYTES_PER_ELEMENT) {\r\n return bytes.buffer;\r\n }\r\n return bytesToArrayBuffer(bytes);\r\n} */\r\n\r\nexport function convertToUint8Array(bytes: Uint8Array | ArrayBuffer | number[] | string): Uint8Array {\r\n if(bytes instanceof Uint8Array) {\r\n return bytes;\r\n } else if(typeof(bytes) === 'string') {\r\n return new TextEncoder().encode(bytes);\r\n }\r\n\r\n return new Uint8Array(bytes);\r\n}\r\n\r\n/* export function bytesFromArrayBuffer(buffer: ArrayBuffer) {\r\n const len = buffer.byteLength;\r\n const byteView = new Uint8Array(buffer);\r\n const bytes: number[] = [];\r\n\r\n for(let i = 0; i < len; ++i) {\r\n bytes[i] = byteView[i];\r\n }\r\n\r\n return bytes;\r\n}\r\n\r\nexport function bufferConcat(buffer1: any, buffer2: any) {\r\n const l1 = buffer1.byteLength || buffer1.length;\r\n const l2 = buffer2.byteLength || buffer2.length;\r\n const tmp = new Uint8Array(l1 + l2);\r\n tmp.set(buffer1 instanceof ArrayBuffer ? new Uint8Array(buffer1) : buffer1, 0);\r\n tmp.set(buffer2 instanceof ArrayBuffer ? new Uint8Array(buffer2) : buffer2, l1);\r\n\r\n return tmp.buffer;\r\n} */\r\n\r\nexport function bufferConcats(...args: (ArrayBuffer | Uint8Array | number[])[]) {\r\n const length = args.reduce((acc, v) => acc + ((v as ArrayBuffer).byteLength || (v as Uint8Array).length), 0);\r\n\r\n const tmp = new Uint8Array(length);\r\n \r\n let lastLength = 0;\r\n args.forEach(b => {\r\n tmp.set(b instanceof ArrayBuffer ? new Uint8Array(b) : b, lastLength);\r\n lastLength += (b as ArrayBuffer).byteLength || (b as Uint8Array).length;\r\n });\r\n\r\n return tmp/* .buffer */;\r\n}\r\n\r\nexport function bytesFromWordss(input: Uint32Array) {\r\n const o = new Uint8Array(input.byteLength);\r\n for(let i = 0, length = input.length * 4; i < length; ++i) {\r\n o[i] = ((input[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff);\r\n }\r\n\r\n return o;\r\n}\r\n\r\nexport function bytesToWordss(input: Parameters<typeof convertToUint8Array>[0]) {\r\n const bytes = convertToUint8Array(input);\r\n\r\n const words: number[] = [];\r\n for(let i = 0, len = bytes.length; i < len; ++i) {\r\n words[i >>> 2] |= bytes[i] << (24 - (i % 4) * 8);\r\n }\r\n\r\n return new Uint32Array(words);\r\n}\r\n\r\n// * https://stackoverflow.com/a/52827031\r\n/* export const isBigEndian = (() => {\r\n const array = new Uint8Array(4);\r\n const view = new Uint32Array(array.buffer);\r\n return !((view[0] = 1) & array[0]);\r\n})(); */\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { Document, InputFileLocation, InputStickerSet, MessagesAllStickers, MessagesFeaturedStickers, MessagesFoundStickerSets, MessagesRecentStickers, MessagesStickers, MessagesStickerSet, PhotoSize, StickerPack, StickerSet, StickerSetCovered } from '../../layer';\nimport { Modify } from '../../types';\nimport apiManager from '../mtproto/mtprotoworker';\nimport rootScope from '../rootScope';\nimport appDocsManager, { MyDocument } from './appDocsManager';\nimport AppStorage from '../storage';\nimport { MOUNT_CLASS_TO } from '../../config/debug';\nimport { forEachReverse } from '../../helpers/array';\nimport DATABASE_STATE from '../../config/databases/state';\nimport { readBlobAsText } from '../../helpers/blob';\nimport lottieLoader from '../rlottie/lottieLoader';\nimport mediaSizes from '../../helpers/mediaSizes';\nimport { getEmojiToneIndex } from '../../vendor/emoji';\nimport RichTextProcessor from '../richtextprocessor';\nimport assumeType from '../../helpers/assumeType';\nimport fixBase64String from '../../helpers/fixBase64String';\n\nconst CACHE_TIME = 3600e3;\n\nconst EMOJI_SET_LOCAL_ID = 'emoji';\nconst EMOJI_ANIMATIONS_SET_LOCAL_ID = 'emojiAnimations';\nconst LOCAL_IDS_SET = new Set([\n EMOJI_SET_LOCAL_ID,\n EMOJI_ANIMATIONS_SET_LOCAL_ID\n]);\n\n// let TEST_FILE_REFERENCE_REFRESH = true;\n\nexport type MyStickerSetInput = {\n id: StickerSet.stickerSet['id'],\n access_hash?: StickerSet.stickerSet['access_hash']\n};\n\nexport type MyMessagesStickerSet = MessagesStickerSet.messagesStickerSet;\n\nexport class AppStickersManager {\n private storage = new AppStorage<Record<Long, MyMessagesStickerSet>, typeof DATABASE_STATE>(DATABASE_STATE, 'stickerSets');\n\n private getStickerSetPromises: {[setId: Long]: Promise<MyMessagesStickerSet>};\n private getStickersByEmoticonsPromises: {[emoticon: string]: Promise<Document[]>};\n\n private greetingStickers: Document.document[];\n private getGreetingStickersTimeout: number;\n private getGreetingStickersPromise: Promise<void>;\n\n private sounds: Record<string, MyDocument>;\n getAnimatedEmojiSoundsPromise: Promise<void>;\n \n constructor() {\n this.getStickerSetPromises = {};\n this.getStickersByEmoticonsPromises = {}; \n this.sounds = {};\n\n this.getAnimatedEmojiStickerSet();\n\n rootScope.addMultipleEventsListeners({\n updateNewStickerSet: (update) => {\n const stickerSet = update.stickerset as MyMessagesStickerSet;\n this.saveStickerSet(stickerSet, stickerSet.set.id);\n rootScope.dispatchEvent('stickers_installed', stickerSet.set);\n }\n });\n\n this.getGreetingStickersTimeout = window.setTimeout(() => {\n this.getGreetingStickersTimeout = undefined;\n this.getGreetingSticker(true);\n }, 5000);\n }\n\n public getGreetingSticker(justPreload = false) {\n if(this.getGreetingStickersTimeout) {\n clearTimeout(this.getGreetingStickersTimeout);\n this.getGreetingStickersTimeout = undefined;\n }\n\n if(!this.getGreetingStickersPromise) {\n this.getGreetingStickersPromise = this.getStickersByEmoticon('👋⭐️', false).then(docs => {\n if(!docs.length) throw 'NO_STICKERS';\n this.greetingStickers = docs.slice() as Document.document[];\n this.greetingStickers.sort((a, b) => Math.random() - Math.random());\n });\n }\n \n return this.getGreetingStickersPromise.then(() => {\n let doc: Document.document;\n if(!justPreload) {\n doc = this.greetingStickers.shift();\n this.greetingStickers.push(doc);\n }\n\n appDocsManager.downloadDoc(this.greetingStickers[0]); // preload next sticker\n\n return doc;\n });\n }\n\n public saveStickers(docs: Document[]) {\n forEachReverse(docs, (doc, idx) => {\n doc = appDocsManager.saveDoc(doc);\n\n if(!doc) docs.splice(idx, 1);\n else docs[idx] = doc;\n });\n }\n\n public async getStickerSet(set: MyStickerSetInput, params: Partial<{\n overwrite: boolean,\n useCache: boolean,\n saveById: boolean\n }> = {}): Promise<MyMessagesStickerSet> {\n const id = set.id;\n if(this.getStickerSetPromises[id]) {\n return this.getStickerSetPromises[id];\n }\n\n return this.getStickerSetPromises[id] = new Promise(async(resolve) => {\n if(!params.overwrite) {\n // const perf = performance.now();\n const cachedSet = await this.storage.get(id);\n if(cachedSet && cachedSet.documents?.length && ((Date.now() - cachedSet.refreshTime) < CACHE_TIME || params.useCache)) {\n this.saveStickers(cachedSet.documents);\n resolve(cachedSet);\n delete this.getStickerSetPromises[id];\n // console.log('get sticker set from cache time', id, performance.now() - perf);\n return;\n }\n }\n\n try {\n const stickerSet = await apiManager.invokeApi('messages.getStickerSet', {\n stickerset: this.getStickerSetInput(set),\n hash: 0\n }) as MyMessagesStickerSet;\n \n const saveById = params.saveById ? id : stickerSet.set.id;\n this.saveStickerSet(stickerSet, saveById);\n \n resolve(stickerSet);\n } catch(err) {\n resolve(null);\n }\n \n delete this.getStickerSetPromises[id];\n });\n }\n\n public getAnimatedEmojiStickerSet() {\n return Promise.all([\n this.getStickerSet({id: EMOJI_SET_LOCAL_ID}, {saveById: true}),\n this.getStickerSet({id: EMOJI_ANIMATIONS_SET_LOCAL_ID}, {saveById: true}),\n this.getAnimatedEmojiSounds()\n ]).then(([emoji, animations]) => {\n return {emoji, animations};\n });\n }\n\n public getAnimatedEmojiSounds(overwrite?: boolean) {\n if(this.getAnimatedEmojiSoundsPromise && !overwrite) return this.getAnimatedEmojiSoundsPromise;\n return this.getAnimatedEmojiSoundsPromise = apiManager.getAppConfig(overwrite).then(appConfig => {\n for(const emoji in appConfig.emojies_sounds) {\n const sound = appConfig.emojies_sounds[emoji];\n const bytesStr = atob(fixBase64String(sound.file_reference_base64, false));\n const bytes = new Uint8Array(bytesStr.length);\n for(let i = 0, length = bytes.length; i < length; ++i) {\n bytes[i] = bytesStr[i].charCodeAt(0);\n }\n\n // if(TEST_FILE_REFERENCE_REFRESH) {\n // bytes[0] = bytes[1] = bytes[2] = bytes[3] = bytes[4] = 0;\n // sound.access_hash += '999';\n // }\n \n const doc = appDocsManager.saveDoc({\n _: 'document',\n pFlags: {},\n flags: 0,\n id: sound.id,\n access_hash: sound.access_hash,\n attributes: [{\n _: 'documentAttributeAudio',\n duration: 1,\n pFlags: {\n voice: true\n }\n }],\n date: 0,\n dc_id: rootScope.config.this_dc,\n file_reference: bytes,\n mime_type: 'audio/ogg',\n size: 1\n // size: 101010 // test loading everytime\n }, {\n type: 'emojiesSounds'\n });\n\n this.sounds[emoji] = doc;\n }\n\n // if(TEST_FILE_REFERENCE_REFRESH) {\n // TEST_FILE_REFERENCE_REFRESH = false;\n // }\n });\n }\n\n public async getRecentStickers(): Promise<Modify<MessagesRecentStickers.messagesRecentStickers, {\n stickers: Document[]\n }>> {\n const res = await apiManager.invokeApiHashable({\n method: 'messages.getRecentStickers',\n processResult: (res) => {\n assumeType<MessagesRecentStickers.messagesRecentStickers>(res);\n this.saveStickers(res.stickers);\n return res;\n }\n });\n\n return res;\n }\n\n private cleanEmoji(emoji: string) {\n return emoji.replace(/\\ufe0f/g, '').replace(/🏻|🏼|🏽|🏾|🏿/g, '');\n }\n\n public getAnimatedEmojiSticker(emoji: string, isAnimation?: boolean) {\n const stickerSet = this.storage.getFromCache(isAnimation ? EMOJI_ANIMATIONS_SET_LOCAL_ID : EMOJI_SET_LOCAL_ID);\n if(!stickerSet || !stickerSet.documents) return undefined;\n\n emoji = this.cleanEmoji(emoji);\n const pack = stickerSet.packs.find(p => p.emoticon === emoji);\n return pack ? appDocsManager.getDoc(pack.documents[0]) : undefined;\n }\n\n public getAnimatedEmojiSoundDocument(emoji: string) {\n return this.sounds[this.cleanEmoji(emoji)];\n }\n\n public preloadAnimatedEmojiSticker(emoji: string, width?: number, height?: number) {\n const preloadEmojiPromise = this.getAnimatedEmojiStickerSet().then(() => {\n const doc = this.getAnimatedEmojiSticker(emoji);\n if(doc) {\n return appDocsManager.downloadDoc(doc)\n .then(readBlobAsText)\n .then(async(json) => {\n const mediaSize = mediaSizes.active.emojiSticker;\n const toneIndex = getEmojiToneIndex(emoji);\n const animation = await lottieLoader.loadAnimationWorker({\n container: undefined,\n animationData: json,\n width: width ?? mediaSize.width,\n height: height ?? mediaSize.height,\n name: 'doc' + doc.id,\n autoplay: false,\n loop: false\n }, 'none', toneIndex);\n\n animation.addEventListener('firstFrame', () => {\n appDocsManager.saveLottiePreview(doc, animation.canvas, toneIndex);\n animation.remove();\n }, {once: true});\n });\n }\n });\n \n return Promise.all([\n preloadEmojiPromise,\n this.preloadAnimatedEmojiStickerAnimation(emoji)\n ]);\n }\n\n public preloadAnimatedEmojiStickerAnimation(emoji: string) {\n return this.getAnimatedEmojiStickerSet().then(() => {\n const doc = this.getAnimatedEmojiSticker(emoji, true);\n if(doc) {\n const soundDoc = this.getAnimatedEmojiSoundDocument(emoji);\n return Promise.all([\n appDocsManager.downloadDoc(doc),\n soundDoc ? appDocsManager.downloadDoc(soundDoc) : undefined\n ]);\n }\n });\n }\n \n public saveStickerSet(res: Omit<MessagesStickerSet.messagesStickerSet, '_'>, id: DocId) {\n //console.log('stickers save set', res);w\n\n const newSet: MessagesStickerSet = {\n _: 'messages.stickerSet',\n set: res.set,\n packs: res.packs,\n documents: res.documents as Document[]\n };\n \n let stickerSet = this.storage.getFromCache(id);\n if(stickerSet) {\n Object.assign(stickerSet, newSet);\n } else {\n stickerSet = this.storage.setToCache(id, newSet);\n }\n\n this.saveStickers(res.documents);\n \n //console.log('stickers wrote', this.stickerSets);\n const needSave = stickerSet.set.installed_date || LOCAL_IDS_SET.has(id as any);\n stickerSet.refreshTime = Date.now();\n this.storage.set({[id]: stickerSet}, !needSave);\n }\n\n public getStickerSetThumbDownloadOptions(stickerSet: StickerSet.stickerSet) {\n const thumb = stickerSet.thumbs.find(thumb => thumb._ === 'photoSize') as PhotoSize.photoSize;\n const dcId = stickerSet.thumb_dc_id;\n\n const isAnimated = stickerSet.pFlags?.animated;\n\n const input: InputFileLocation.inputStickerSetThumb = {\n _: 'inputStickerSetThumb',\n stickerset: this.getStickerSetInput(stickerSet),\n thumb_version: stickerSet.thumb_version\n };\n\n return {dcId, location: input, size: thumb.size, mimeType: isAnimated ? 'application/x-tgsticker' : 'image/webp'};\n }\n\n /* public getStickerSetThumbURL(stickerSet: MTStickerSet) {\n const thumb = stickerSet.thumb;\n const dcId = stickerSet.thumb_dc_id;\n\n const isAnimated = stickerSet.pFlags?.animated;\n\n const input: inputStickerSetThumb = {\n _: 'inputStickerSetThumb',\n stickerset: this.getStickerSetInput(stickerSet),\n volume_id: thumb.location.volume_id,\n local_id: thumb.location.local_id\n };\n\n const url = getFileURL('document', this.getStickerSetThumbDownloadOptions(stickerSet));\n return url;\n\n //return promise;\n } */\n\n public getStickerSetInput(set: MyStickerSetInput): InputStickerSet {\n if(set.id === EMOJI_SET_LOCAL_ID) {\n return {\n _: 'inputStickerSetAnimatedEmoji'\n };\n } else if(set.id === EMOJI_ANIMATIONS_SET_LOCAL_ID) {\n return {\n _: 'inputStickerSetAnimatedEmojiAnimations'\n };\n } else if(!set.access_hash) {\n return {\n _: 'inputStickerSetShortName',\n short_name: '' + set.id\n };\n } else {\n return {\n _: 'inputStickerSetID',\n id: set.id,\n access_hash: set.access_hash\n };\n }\n }\n\n public async getFeaturedStickers() {\n const res = await apiManager.invokeApiHashable({\n method: 'messages.getFeaturedStickers',\n processResult: (res) => {\n assumeType<MessagesFeaturedStickers.messagesFeaturedStickers>(res);\n res.sets.forEach(covered => {\n this.saveStickerSet({set: covered.set, documents: [], packs: []}, covered.set.id);\n });\n\n return res;\n }\n });\n\n return res.sets;\n }\n\n public async toggleStickerSet(set: StickerSet.stickerSet) {\n if(set.installed_date) {\n const res = await apiManager.invokeApi('messages.uninstallStickerSet', {\n stickerset: this.getStickerSetInput(set)\n });\n\n if(res) {\n delete set.installed_date;\n rootScope.dispatchEvent('stickers_deleted', set);\n this.storage.delete(set.id, true);\n return true;\n }\n } else {\n const res = await apiManager.invokeApi('messages.installStickerSet', {\n stickerset: this.getStickerSetInput(set),\n archived: false\n });\n\n if(res) {\n set.installed_date = Date.now() / 1000 | 0;\n rootScope.dispatchEvent('stickers_installed', set);\n return true;\n }\n }\n\n return false;\n }\n\n public async searchStickerSets(query: string, excludeFeatured = true) {\n const flags = excludeFeatured ? 1 : 0;\n const res = await apiManager.invokeApiHashable({\n method: 'messages.searchStickerSets', \n params: {\n flags,\n exclude_featured: excludeFeatured || undefined,\n q: query\n },\n processResult: (res) => {\n assumeType<MessagesFoundStickerSets.messagesFoundStickerSets>(res);\n\n res.sets.forEach(covered => {\n this.saveStickerSet({set: covered.set, documents: [], packs: []}, covered.set.id);\n });\n\n return res;\n }\n });\n\n const foundSaved: StickerSetCovered[] = [];\n const cache = this.storage.getCache();\n for(let id in cache) {\n const {set} = cache[id];\n\n if(set.title.toLowerCase().includes(query.toLowerCase()) && !res.sets.find(c => c.set.id === set.id)) {\n foundSaved.push({_: 'stickerSetCovered', set, cover: null});\n }\n }\n\n return res.sets.concat(foundSaved);\n }\n\n public getAllStickers() {\n return apiManager.invokeApiHashable({method: 'messages.getAllStickers'});\n }\n\n public preloadStickerSets() {\n return this.getAllStickers().then(allStickers => {\n return Promise.all((allStickers as MessagesAllStickers.messagesAllStickers).sets.map(set => this.getStickerSet(set, {useCache: true})));\n });\n }\n\n // TODO: detect \"🤷\" by \"🤷‍♂️\"\n public getStickersByEmoticon(emoticon: string, includeOurStickers = true) {\n emoticon = RichTextProcessor.fixEmoji(emoticon);\n if(this.getStickersByEmoticonsPromises[emoticon]) return this.getStickersByEmoticonsPromises[emoticon];\n\n return this.getStickersByEmoticonsPromises[emoticon] = Promise.all([\n apiManager.invokeApiHashable({\n method: 'messages.getStickers', \n params: {\n emoticon\n }\n }),\n includeOurStickers ? this.preloadStickerSets() : [],\n includeOurStickers ? this.getRecentStickers() : undefined\n ]).then(([messagesStickers, installedSets, recentStickers]) => {\n const foundStickers = (messagesStickers as MessagesStickers.messagesStickers).stickers.map(sticker => appDocsManager.saveDoc(sticker));\n const cachedStickersAnimated: Document.document[] = [], cachedStickersStatic: Document.document[] = [];\n\n //console.log('getStickersByEmoticon', messagesStickers, installedSets, recentStickers);\n\n const iteratePacks = (packs: StickerPack.stickerPack[]) => {\n for(const pack of packs) {\n const packEmoticon = RichTextProcessor.fixEmoji(pack.emoticon);\n if(packEmoticon.includes(emoticon)) {\n for(const docId of pack.documents) {\n const doc = appDocsManager.getDoc(docId);\n (doc.animated ? cachedStickersAnimated : cachedStickersStatic).push(doc);\n }\n }\n }\n };\n\n if(recentStickers) {\n iteratePacks(recentStickers.packs);\n const stickers = recentStickers.stickers;\n [cachedStickersAnimated, cachedStickersStatic].forEach(s => {\n s.sort((a, b) => stickers.indexOf(a) - stickers.indexOf(b));\n });\n }\n\n for(const set of installedSets) {\n iteratePacks(set.packs);\n }\n\n /* const entities = RichTextProcessor.parseEntities(emoticon);\n if(entities.length === 1) {\n [cachedStickersAnimated, cachedStickersStatic].forEach(s => {\n forEachReverse(s, (doc, idx) => {\n const docEmoticon = RichTextProcessor.fixEmoji(doc.stickerEmojiRaw);\n if(docEmoticon !== emoticon) {\n s.splice(idx, 1);\n }\n });\n });\n } */\n\n const stickers = [...new Set(cachedStickersAnimated.concat(cachedStickersStatic, foundStickers))]/* .filter(doc => !doc.animated) */;\n\n return stickers;\n });\n }\n\n public pushRecentSticker(doc: MyDocument) {\n const docEmoticon = RichTextProcessor.fixEmoji(doc.stickerEmojiRaw);\n for(const emoticon in this.getStickersByEmoticonsPromises) {\n const promise = this.getStickersByEmoticonsPromises[emoticon];\n promise.then(stickers => {\n const _doc = stickers.findAndSplice(_doc => _doc.id === doc.id);\n if(_doc) {\n stickers.unshift(_doc);\n } else if(emoticon.includes(docEmoticon)) {\n stickers.unshift(doc);\n }\n });\n }\n }\n}\n\nconst appStickersManager = new AppStickersManager();\nMOUNT_CLASS_TO.appStickersManager = appStickersManager;\nexport default appStickersManager;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov <igor.beatle@gmail.com>\n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\nimport { tsNow } from \"../../helpers/date\";\nimport { numberThousandSplitter } from \"../../helpers/number\";\nimport { ChannelParticipantsFilter, ChannelsChannelParticipants, ChannelParticipant, Chat, ChatFull, ChatParticipants, ChatPhoto, ExportedChatInvite, InputChannel, InputFile, SendMessageAction, Update, UserFull } from \"../../layer\";\nimport { LangPackKey, i18n } from \"../langPack\";\n//import apiManager from '../mtproto/apiManager';\nimport apiManager from '../mtproto/mtprotoworker';\nimport { RichTextProcessor } from \"../richtextprocessor\";\nimport rootScope from \"../rootScope\";\nimport SearchIndex from \"../searchIndex\";\nimport apiUpdatesManager from \"./apiUpdatesManager\";\nimport appChatsManager from \"./appChatsManager\";\nimport appMessagesIdsManager from \"./appMessagesIdsManager\";\nimport appNotificationsManager from \"./appNotificationsManager\";\nimport appPeersManager from \"./appPeersManager\";\nimport appPhotosManager from \"./appPhotosManager\";\nimport appUsersManager, { MyTopPeer, User } from \"./appUsersManager\";\n\nexport type UserTyping = Partial<{userId: UserId, action: SendMessageAction, timeout: number}>;\n\nexport class AppProfileManager {\n //private botInfos: any = {};\n public usersFull: {[id: UserId]: UserFull.userFull} = {};\n public chatsFull: {[id: ChatId]: ChatFull} = {};\n private typingsInPeer: {[peerId: PeerId]: UserTyping[]};\n\n constructor() {\n rootScope.addMultipleEventsListeners({\n updateChatParticipants: (update) => {\n const participants = update.participants;\n if(participants._ === 'chatParticipants') {\n const chatId = participants.chat_id;\n const chatFull = this.chatsFull[chatId] as ChatFull.chatFull;\n if(chatFull !== undefined) {\n chatFull.participants = participants;\n rootScope.dispatchEvent('chat_full_update', chatId);\n }\n }\n },\n\n updateChatParticipantAdd: (update) => {\n const chatFull = this.chatsFull[update.chat_id] as ChatFull.chatFull;\n if(chatFull !== undefined) {\n const _participants = chatFull.participants as ChatParticipants.chatParticipants;\n const participants = _participants.participants || [];\n for(let i = 0, length = participants.length; i < length; i++) {\n if(participants[i].user_id === update.user_id) {\n return;\n }\n }\n\n participants.push({\n _: 'chatParticipant',\n user_id: update.user_id,\n inviter_id: update.inviter_id,\n date: tsNow(true)\n });\n\n _participants.version = update.version;\n rootScope.dispatchEvent('chat_full_update', update.chat_id);\n }\n },\n\n updateChatParticipantDelete: (update) => {\n const chatFull = this.chatsFull[update.chat_id] as ChatFull.chatFull;\n if(chatFull !== undefined) {\n const _participants = chatFull.participants as ChatParticipants.chatParticipants;\n const participants = _participants.participants || [];\n for(let i = 0, length = participants.length; i < length; i++) {\n if(participants[i].user_id === update.user_id) {\n participants.splice(i, 1);\n _participants.version = update.version;\n rootScope.dispatchEvent('chat_full_update', update.chat_id);\n return;\n }\n }\n }\n },\n\n updateUserTyping: this.onUpdateUserTyping,\n updateChatUserTyping: this.onUpdateUserTyping,\n updateChannelUserTyping: this.onUpdateUserTyping,\n\n updatePeerBlocked: this.onUpdatePeerBlocked\n });\n\n rootScope.addEventListener('chat_update', (chatId) => {\n const fullChat = this.chatsFull[chatId];\n const chat: Chat.chat | Chat.channel | Chat.chatForbidden | Chat.channelForbidden = appChatsManager.getChat(chatId);\n if(!fullChat || !chat) {\n return;\n }\n\n let updated = false;\n if(!!fullChat.call !== !!(chat as Chat.chat).pFlags?.call_active) {\n updated = true;\n }\n\n const {photo} = chat as Chat.chat;\n if(photo) {\n const hasChatPhoto = photo._ !== 'chatPhotoEmpty';\n const hasFullChatPhoto = fullChat.chat_photo?._ !== 'photoEmpty';\n if(hasChatPhoto !== hasFullChatPhoto || (photo as ChatPhoto.chatPhoto).photo_id !== fullChat.chat_photo?.id) {\n updated = true;\n }\n }\n\n if(updated) {\n this.refreshFullPeer(chatId.toPeerId(true));\n }\n });\n\n // * genius\n rootScope.addEventListener('chat_full_update', (chatId) => {\n rootScope.dispatchEvent('peer_full_update', chatId.toPeerId(true));\n });\n \n // * genius\n rootScope.addEventListener('user_full_update', (userId) => {\n rootScope.dispatchEvent('peer_full_update', userId.toPeerId(false));\n });\n\n rootScope.addEventListener('invalidate_participants', (chatId) => {\n this.invalidateChannelParticipants(chatId);\n });\n\n this.typingsInPeer = {};\n }\n\n /* public saveBotInfo(botInfo: any) {\n const botId = botInfo && botInfo.user_id;\n if(!botId) {\n return null;\n }\n\n const commands: any = {};\n botInfo.commands.forEach((botCommand: any) => {\n commands[botCommand.command] = botCommand.description;\n });\n\n return this.botInfos[botId] = {\n id: botId,\n version: botInfo.version,\n shareText: botInfo.share_text,\n description: botInfo.description,\n commands: commands\n };\n } */\n\n public getProfile(id: UserId, override?: true): Promise<UserFull> {\n if(this.usersFull[id] && !override) {\n return Promise.resolve(this.usersFull[id]);\n }\n\n return apiManager.invokeApiSingleProcess({\n method: 'users.getFullUser', \n params: {\n id: appUsersManager.getUserInput(id)\n },\n processResult: (usersUserFull) => {\n appChatsManager.saveApiChats(usersUserFull.chats, true);\n appUsersManager.saveApiUsers(usersUserFull.users);\n\n const userFull = usersUserFull.full_user;\n const peerId = id.toPeerId(false);\n if(userFull.profile_photo) {\n userFull.profile_photo = appPhotosManager.savePhoto(userFull.profile_photo, {type: 'profilePhoto', peerId});\n }\n\n if(userFull.about !== undefined) {\n userFull.rAbout = RichTextProcessor.wrapRichText(userFull.about, {noLinebreaks: true});\n }\n\n appNotificationsManager.savePeerSettings({\n peerId, \n settings: userFull.notify_settings\n });\n\n this.usersFull[id] = userFull;\n\n /* if(userFull.bot_info) {\n userFull.bot_info = this.saveBotInfo(userFull.bot_info) as any;\n } */\n\n //appMessagesManager.savePinnedMessage(id, userFull.pinned_msg_id);\n\n rootScope.dispatchEvent('user_full_update', id);\n return userFull;\n }\n });\n }\n\n public getProfileByPeerId(peerId: PeerId, override?: true): Promise<ChatFull.chatFull | ChatFull.channelFull | UserFull.userFull> {\n if(appPeersManager.isAnyChat(peerId)) return this.getChatFull(peerId.toChatId(), override);\n else return this.getProfile(peerId.toUserId(), override);\n }\n\n public getCachedFullChat(chatId: ChatId) {\n return this.chatsFull[chatId];\n }\n\n public getCachedFullUser(userId: UserId) {\n return this.usersFull[userId];\n }\n\n public getCachedProfileByPeerId(peerId: PeerId) {\n return peerId.isUser() ? this.getCachedFullUser(peerId.toUserId()) : this.getCachedFullChat(peerId.toChatId());\n }\n\n public getFullPhoto(peerId: PeerId) {\n return this.getProfileByPeerId(peerId).then(profile => {\n switch(profile._) {\n case 'userFull':\n return profile.profile_photo;\n case 'channelFull':\n case 'chatFull':\n return profile.chat_photo;\n }\n });\n }\n\n /* public getPeerBots(peerId: PeerId) {\n var peerBots: any[] = [];\n if(peerId >= 0 && !appUsersManager.isBot(peerId) ||\n (appPeersManager.isChannel(peerId) && !appPeersManager.isMegagroup(peerId))) {\n return Promise.resolve(peerBots);\n }\n if(peerId >= 0) {\n return this.getProfile(peerId).then((userFull: any) => {\n var botInfo = userFull.bot_info;\n if(botInfo && botInfo._ !== 'botInfoEmpty') {\n peerBots.push(botInfo);\n }\n return peerBots;\n });\n }\n\n return this.getChatFull(peerId.toChatId()).then((chatFull: any) => {\n chatFull.bot_info.forEach((botInfo: any) => {\n peerBots.push(this.saveBotInfo(botInfo))\n });\n return peerBots;\n });\n } */\n\n public getChatFull(id: ChatId, override?: true): Promise<ChatFull.chatFull | ChatFull.channelFull> {\n if(appChatsManager.isChannel(id)) {\n return this.getChannelFull(id, override);\n }\n\n const fullChat = this.chatsFull[id] as ChatFull.chatFull;\n if(fullChat && !override) {\n const chat = appChatsManager.getChat(id);\n if(chat.version === (fullChat.participants as ChatParticipants.chatParticipants).version ||\n chat.pFlags.left) {\n return Promise.resolve(fullChat);\n }\n }\n \n return apiManager.invokeApiSingleProcess({\n method: 'messages.getFullChat', \n params: {\n chat_id: id\n },\n processResult: (result) => {\n appChatsManager.saveApiChats(result.chats, true);\n appUsersManager.saveApiUsers(result.users);\n const fullChat = result.full_chat as ChatFull.chatFull;\n const peerId = id.toPeerId(true);\n if(fullChat && fullChat.chat_photo && fullChat.chat_photo.id) {\n fullChat.chat_photo = appPhotosManager.savePhoto(fullChat.chat_photo, {type: 'profilePhoto', peerId});\n }\n\n //appMessagesManager.savePinnedMessage(peerId, fullChat.pinned_msg_id);\n appNotificationsManager.savePeerSettings({\n peerId, \n settings: fullChat.notify_settings\n });\n \n this.chatsFull[id] = fullChat;\n rootScope.dispatchEvent('chat_full_update', id);\n\n return fullChat;\n }\n });\n }\n\n public getChatInviteLink(id: ChatId, force?: boolean) {\n return this.getChatFull(id).then((chatFull) => {\n if(!force &&\n chatFull.exported_invite &&\n chatFull.exported_invite._ == 'chatInviteExported') {\n return chatFull.exported_invite.link;\n }\n \n return apiManager.invokeApi('messages.exportChatInvite', {\n peer: appPeersManager.getInputPeerById(id.toPeerId(true))\n }).then((exportedInvite) => {\n if(this.chatsFull[id] !== undefined) {\n this.chatsFull[id].exported_invite = exportedInvite;\n }\n\n return (exportedInvite as ExportedChatInvite.chatInviteExported).link;\n });\n });\n }\n\n public getChannelParticipants(id: ChatId, filter: ChannelParticipantsFilter = {_: 'channelParticipantsRecent'}, limit = 200, offset = 0) {\n if(filter._ === 'channelParticipantsRecent') {\n const chat = appChatsManager.getChat(id);\n if(chat &&\n chat.pFlags && (\n chat.pFlags.kicked ||\n chat.pFlags.broadcast && !chat.pFlags.creator && !chat.admin_rights\n )) {\n return Promise.reject();\n }\n }\n\n return apiManager.invokeApiCacheable('channels.getParticipants', {\n channel: appChatsManager.getChannelInput(id),\n filter,\n offset,\n limit,\n hash: '0'\n }, {cacheSeconds: 60}).then(result => {\n appUsersManager.saveApiUsers((result as ChannelsChannelParticipants.channelsChannelParticipants).users);\n return result as ChannelsChannelParticipants.channelsChannelParticipants;\n });\n /* let maybeAddSelf = (participants: any[]) => {\n let chat = appChatsManager.getChat(id);\n let selfMustBeFirst = filter._ === 'channelParticipantsRecent' &&\n !offset &&\n !chat.pFlags.kicked &&\n !chat.pFlags.left;\n\n if(selfMustBeFirst) {\n participants = copy(participants);\n let myID = appUsersManager.getSelf().id;\n let myIndex = participants.findIndex(p => p.user_id === myID);\n let myParticipant;\n\n if(myIndex !== -1) {\n myParticipant = participants[myIndex];\n participants.splice(myIndex, 1);\n } else {\n myParticipant = {_: 'channelParticipantSelf', user_id: myID};\n }\n\n participants.unshift(myParticipant);\n }\n\n return participants;\n } */\n }\n\n public getChannelParticipant(id: ChatId, peerId: PeerId) {\n return apiManager.invokeApiSingle('channels.getParticipant', {\n channel: appChatsManager.getChannelInput(id),\n participant: appPeersManager.getInputPeerById(peerId),\n }).then(channelParticipant => {\n appUsersManager.saveApiUsers(channelParticipant.users);\n return channelParticipant.participant;\n });\n }\n\n public getChannelFull(id: ChatId, override?: true): Promise<ChatFull.channelFull> {\n if(this.chatsFull[id] !== undefined && !override) {\n return Promise.resolve(this.chatsFull[id] as ChatFull.channelFull);\n }\n\n return apiManager.invokeApiSingleProcess({\n method: 'channels.getFullChannel', \n params: {\n channel: appChatsManager.getChannelInput(id)\n }, \n processResult: (result) => {\n const peerId = id.toPeerId(true);\n appChatsManager.saveApiChats(result.chats, true);\n appUsersManager.saveApiUsers(result.users);\n const fullChannel = result.full_chat as ChatFull.channelFull;\n if(fullChannel && fullChannel.chat_photo.id) {\n fullChannel.chat_photo = appPhotosManager.savePhoto(fullChannel.chat_photo, {type: 'profilePhoto', peerId});\n //appPhotosManager.savePhoto(fullChannel.chat_photo);\n }\n appNotificationsManager.savePeerSettings({\n peerId, \n settings: fullChannel.notify_settings\n });\n\n this.chatsFull[id] = fullChannel;\n rootScope.dispatchEvent('chat_full_update', id);\n\n return fullChannel;\n }, \n processError: (error) => {\n switch(error.type) {\n case 'CHANNEL_PRIVATE':\n let channel = appChatsManager.getChat(id);\n channel = {_: 'channelForbidden', access_hash: channel.access_hash, title: channel.title};\n apiUpdatesManager.processUpdateMessage({\n _: 'updates',\n updates: [{\n _: 'updateChannel',\n channel_id: id\n } as Update.updateChannel],\n chats: [channel],\n users: []\n });\n break;\n }\n\n throw error;\n }\n });\n }\n\n public getMentions(chatId: ChatId, query: string, threadId?: number): Promise<PeerId[]> {\n const processUserIds = (topPeers: MyTopPeer[]) => {\n const startsWithAt = query.charAt(0) === '@';\n if(startsWithAt) query = query.slice(1);\n /* const startsWithAt = query.charAt(0) === '@';\n if(startsWithAt) query = query.slice(1);\n \n const index = new SearchIndex<number>(!startsWithAt, !startsWithAt); */\n const index = new SearchIndex<PeerId>({\n ignoreCase: true\n });\n\n const ratingMap: Map<PeerId, number> = new Map();\n topPeers.forEach(peer => {\n index.indexObject(peer.id, appUsersManager.getUserSearchText(peer.id));\n ratingMap.set(peer.id, peer.rating);\n });\n\n const peerIds = Array.from(index.search(query));\n peerIds.sort((a, b) => ratingMap.get(b) - ratingMap.get(a));\n return peerIds;\n };\n\n let promise: Promise<PeerId[]>;\n if(appChatsManager.isChannel(chatId)) {\n promise = this.getChannelParticipants(chatId, {\n _: 'channelParticipantsMentions',\n q: query,\n top_msg_id: appMessagesIdsManager.getServerMessageId(threadId)\n }, 50, 0).then(cP => {\n return cP.participants.map(p => appChatsManager.getParticipantPeerId(p));\n });\n } else if(chatId) {\n promise = (this.getChatFull(chatId) as Promise<ChatFull.chatFull>).then(chatFull => {\n return (chatFull.participants as ChatParticipants.chatParticipants).participants.map(p => p.user_id.toPeerId());\n });\n } else {\n promise = Promise.resolve([]);\n }\n\n return Promise.all([\n // [],\n appUsersManager.getTopPeers('bots_inline').catch(() => [] as MyTopPeer[]), \n promise\n ]).then(results => {\n const peers = results[0].concat(results[1].map(peerId => ({id: peerId, rating: 0})));\n\n return processUserIds(peers);\n });\n }\n\n public invalidateChannelParticipants(id: ChatId) {\n apiManager.clearCache('channels.getParticipants', (params) => (params.channel as InputChannel.inputChannel).channel_id === id);\n this.refreshFullPeer(id.toPeerId(true));\n }\n\n private refreshFullPeer(peerId: PeerId) {\n if(peerId.isUser()) delete this.usersFull[peerId.toUserId()];\n else delete this.chatsFull[peerId.toChatId()];\n\n rootScope.dispatchEvent('peer_full_update', peerId);\n\n // ! эта строчка будет создавать race condition:\n // ! запрос вернёт chat с установленным флагом call_not_empty, хотя сам апдейт уже будет применён\n // this.getProfileByPeerId(peerId, true);\n }\n\n public updateProfile(first_name: string, last_name: string, about: string) {\n return apiManager.invokeApi('account.updateProfile', {\n first_name,\n last_name,\n about\n }).then(user => {\n appUsersManager.saveApiUser(user);\n \n return this.getProfile(rootScope.myId, true);\n });\n }\n\n public uploadProfilePhoto(inputFile: InputFile) {\n return apiManager.invokeApi('photos.uploadProfilePhoto', {\n file: inputFile\n }).then((updateResult) => {\n appUsersManager.saveApiUsers(updateResult.users);\n\n const myId = rootScope.myId;\n appPhotosManager.savePhoto(updateResult.photo, {\n type: 'profilePhoto',\n peerId: myId\n });\n\n const userId = myId.toUserId();\n apiUpdatesManager.processLocalUpdate({\n _: 'updateUserPhoto',\n user_id: userId,\n date: tsNow(true),\n photo: appUsersManager.getUser(userId).photo,\n previous: true\n });\n });\n }\n\n public deletePhotos(photoIds: string[]) {\n return apiManager.invokeApiSingle('photos.deletePhotos', {\n id: photoIds.map(photoId => {\n const photo = appPhotosManager.getPhoto(photoId);\n return appPhotosManager.getInput(photo);\n })\n }).then((deletedList) => {\n \n });\n }\n\n public getChatMembersString(chatId: ChatId) {\n const chat: Chat = appChatsManager.getChat(chatId);\n if(chat._ === 'chatForbidden') {\n return i18n('YouWereKicked');\n }\n\n const chatFull = this.chatsFull[chatId];\n let count: number;\n if(chatFull) {\n if(chatFull._ === 'channelFull') {\n count = chatFull.participants_count;\n } else {\n count = (chatFull.participants as ChatParticipants.chatParticipants).participants?.length;\n }\n } else {\n count = (chat as Chat.chat).participants_count || (chat as any).participants?.participants.length;\n }\n\n const isChannel = appChatsManager.isBroadcast(chatId);\n count = count || 1;\n\n let key: LangPackKey = isChannel ? 'Peer.Status.Subscribers' : 'Peer.Status.Member';\n return i18n(key, [numberThousandSplitter(count)]);\n }\n\n private verifyParticipantForOnlineCount(participant: {user_id: UserId}) {\n const user = appUsersManager.getUser(participant.user_id);\n return !!(user && user.status && user.status._ === 'userStatusOnline');\n }\n\n private reduceParticipantsForOnlineCount(participants: {user_id: UserId}[]) {\n return participants.reduce((acc, participant) => {\n return acc + +this.verifyParticipantForOnlineCount(participant);\n }, 0);\n }\n\n public async getOnlines(id: ChatId): Promise<number> {\n const minOnline = 1;\n if(appChatsManager.isBroadcast(id)) {\n return minOnline;\n }\n \n const chatInfo = await this.getChatFull(id);\n if(appChatsManager.isMegagroup(id)) {\n if((chatInfo as ChatFull.channelFull).participants_count <= 100) {\n const channelParticipants = await this.getChannelParticipants(id, {_: 'channelParticipantsRecent'}, 100);\n return this.reduceParticipantsForOnlineCount(channelParticipants.participants as ChannelParticipant.channelParticipant[]);\n }\n\n const res = await apiManager.invokeApiCacheable('messages.getOnlines', {\n peer: appChatsManager.getChannelInputPeer(id)\n }, {cacheSeconds: 60});\n\n const onlines = res.onlines ?? minOnline;\n return onlines;\n }\n\n const _participants = (chatInfo as ChatFull.chatFull).participants as ChatParticipants.chatParticipants;\n if(_participants?.participants) {\n return this.reduceParticipantsForOnlineCount(_participants.participants);\n } else {\n return minOnline;\n }\n }\n\n private onUpdateUserTyping = (update: Update.updateUserTyping | Update.updateChatUserTyping | Update.updateChannelUserTyping) => {\n const fromId = (update as Update.updateUserTyping).user_id ? \n (update as Update.updateUserTyping).user_id.toPeerId() : \n appPeersManager.getPeerId((update as Update.updateChatUserTyping).from_id);\n if(rootScope.myId === fromId || update.action._ === 'speakingInGroupCallAction') {\n return;\n }\n \n const peerId = appPeersManager.getPeerId(update);\n const typings = this.typingsInPeer[peerId] ?? (this.typingsInPeer[peerId] = []);\n let typing = typings.find(t => t.userId === fromId);\n\n const cancelAction = () => {\n delete typing.timeout;\n //typings.findAndSplice(t => t === typing);\n const idx = typings.indexOf(typing);\n if(idx !== -1) {\n typings.splice(idx, 1);\n }\n\n rootScope.dispatchEvent('peer_typings', {peerId, typings});\n\n if(!typings.length) {\n delete this.typingsInPeer[peerId];\n }\n };\n\n if(typing && typing.timeout !== undefined) {\n clearTimeout(typing.timeout);\n }\n\n if(update.action._ === 'sendMessageCancelAction') {\n if(!typing) {\n return;\n }\n\n cancelAction();\n return;\n }\n\n if(!typing) {\n typing = {\n userId: fromId\n };\n\n typings.push(typing);\n }\n\n //console.log('updateChatUserTyping', update, typings);\n \n typing.action = update.action;\n \n const hasUser = appUsersManager.hasUser(fromId);\n if(!hasUser) {\n // let's load user here\n if(update._ === 'updateChatUserTyping') {\n if(update.chat_id && appChatsManager.hasChat(update.chat_id) && !appChatsManager.isChannel(update.chat_id)) {\n appProfileManager.getChatFull(update.chat_id).then(() => {\n if(typing.timeout !== undefined && appUsersManager.hasUser(fromId)) {\n rootScope.dispatchEvent('peer_typings', {peerId, typings});\n }\n });\n }\n }\n \n //return;\n } else {\n appUsersManager.forceUserOnline(fromId);\n }\n\n typing.timeout = window.setTimeout(cancelAction, 6000);\n if(hasUser) {\n rootScope.dispatchEvent('peer_typings', {peerId, typings});\n }\n };\n\n private onUpdatePeerBlocked = (update: Update.updatePeerBlocked) => {\n const peerId = appPeersManager.getPeerId(update.peer_id);\n if(appPeersManager.isUser(peerId)) {\n const userId = peerId.toUserId();\n const userFull = this.usersFull[userId];\n if(userFull) {\n if(update.blocked) userFull.pFlags.blocked = true;\n else delete userFull.pFlags.blocked;\n }\n\n rootScope.dispatchEvent('user_full_update', userId);\n }\n\n rootScope.dispatchEvent('peer_block', {peerId, blocked: update.blocked});\n };\n\n public getPeerTypings(peerId: PeerId) {\n return this.typingsInPeer[peerId];\n }\n}\n\nconst appProfileManager = new AppProfileManager();\nMOUNT_CLASS_TO.appProfileManager = appProfileManager;\nexport default appProfileManager;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov <igor.beatle@gmail.com>\n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\n//import apiManager from '../mtproto/apiManager';\nimport DEBUG, { MOUNT_CLASS_TO } from '../../config/debug';\nimport { Message, MessageEntity, MessageFwdHeader, Peer, Update, Updates } from '../../layer';\nimport { logger, LogTypes } from '../logger';\nimport apiManager from '../mtproto/mtprotoworker';\nimport rootScope from '../rootScope';\n//import networkerFactory from '../mtproto/networkerFactory';\nimport appUsersManager from \"./appUsersManager\";\nimport appChatsManager from \"./appChatsManager\";\nimport appPeersManager from \"./appPeersManager\";\nimport appStateManager from './appStateManager';\nimport serverTimeManager from '../mtproto/serverTimeManager';\nimport assumeType from '../../helpers/assumeType';\nimport noop from '../../helpers/noop';\nimport RichTextProcessor from '../richtextprocessor';\nimport App from '../../config/app';\n\ntype UpdatesState = {\n pendingPtsUpdates: (Update & {pts: number, pts_count: number})[],\n pendingSeqUpdates?: {[seq: number]: {seq: number, date: number, updates: any[]}},\n syncPending: {\n seqAwaiting?: number,\n ptsAwaiting?: true,\n timeout: number\n },\n syncLoading: Promise<void>,\n\n seq?: number,\n pts?: number,\n date?: number,\n lastPtsUpdateTime?: number\n};\n\nconst SYNC_DELAY = 6;\n\nexport class ApiUpdatesManager {\n public updatesState: UpdatesState = {\n pendingPtsUpdates: [],\n pendingSeqUpdates: {},\n syncPending: null,\n syncLoading: null\n };\n\n private channelStates: {[channelId: ChatId]: UpdatesState} = {};\n private attached = false;\n\n private log = logger('UPDATES', LogTypes.Error | LogTypes.Warn | LogTypes.Log/* | LogTypes.Debug */);\n private debug = DEBUG;\n\n private setProxy() {\n const self = this;\n this.updatesState = new Proxy(this.updatesState, {\n set: function(target: ApiUpdatesManager['updatesState'], key: keyof ApiUpdatesManager['updatesState'], value: ApiUpdatesManager['updatesState'][typeof key]) {\n // @ts-ignore\n target[key] = value;\n self.saveUpdatesState();\n return true;\n }\n });\n }\n\n public saveUpdatesState() {\n const us = this.updatesState;\n appStateManager.pushToState('updates', {\n seq: us.seq,\n pts: us.pts,\n date: us.date\n });\n }\n\n private popPendingSeqUpdate() {\n const state = this.updatesState;\n const nextSeq = state.seq + 1;\n const pendingUpdatesData = state.pendingSeqUpdates[nextSeq];\n if(!pendingUpdatesData) {\n return false;\n }\n\n const updates = pendingUpdatesData.updates;\n for(let i = 0, length = updates.length; i < length; ++i) {\n this.saveUpdate(updates[i]);\n }\n\n state.seq = pendingUpdatesData.seq;\n if(pendingUpdatesData.date && state.date < pendingUpdatesData.date) {\n state.date = pendingUpdatesData.date;\n }\n delete state.pendingSeqUpdates[nextSeq];\n \n if(!this.popPendingSeqUpdate() &&\n state.syncPending &&\n state.syncPending.seqAwaiting &&\n state.seq >= state.syncPending.seqAwaiting) {\n if(!state.syncPending.ptsAwaiting) {\n clearTimeout(state.syncPending.timeout);\n state.syncPending = null;\n } else {\n delete state.syncPending.seqAwaiting;\n }\n }\n \n return true;\n }\n\n private popPendingPtsUpdate(channelId: ChatId) {\n const curState = channelId ? this.getChannelState(channelId) : this.updatesState;\n if(!curState.pendingPtsUpdates.length) {\n return false;\n }\n\n curState.pendingPtsUpdates.sort((a, b) => {\n return a.pts - b.pts;\n });\n // this.log('pop update', channelId, curState.pendingPtsUpdates)\n \n let curPts = curState.pts;\n let goodPts = 0;\n let goodIndex = 0;\n for(let i = 0, length = curState.pendingPtsUpdates.length; i < length; ++i) {\n const update = curState.pendingPtsUpdates[i];\n curPts += update.pts_count;\n if(curPts >= update.pts) {\n goodPts = update.pts;\n goodIndex = i;\n }\n }\n \n if(!goodPts) {\n return false;\n }\n \n this.debug && this.log.debug('pop pending pts updates', goodPts, curState.pendingPtsUpdates.slice(0, goodIndex + 1));\n \n curState.pts = goodPts;\n for(let i = 0; i <= goodIndex; ++i) {\n const update = curState.pendingPtsUpdates[i];\n\n // @ts-ignore\n this.saveUpdate(update);\n }\n curState.pendingPtsUpdates.splice(0, goodIndex + 1);\n \n if(!curState.pendingPtsUpdates.length && curState.syncPending) {\n if(!curState.syncPending.seqAwaiting) {\n clearTimeout(curState.syncPending.timeout);\n curState.syncPending = null;\n } else {\n delete curState.syncPending.ptsAwaiting;\n }\n }\n \n return true;\n }\n\n public forceGetDifference() {\n if(!this.updatesState.syncLoading) {\n this.getDifference();\n }\n }\n\n public processLocalUpdate(update: Update) {\n this.processUpdateMessage({\n _: 'updateShort',\n update\n } as Updates);\n }\n\n public processUpdateMessage = (updateMessage: any, options: Partial<{\n override: boolean\n }> = {}) => {\n // return forceGetDifference()\n const processOpts = {\n date: updateMessage.date,\n seq: updateMessage.seq,\n seqStart: updateMessage.seq_start,\n //ignoreSyncLoading: options.ignoreSyncLoading\n };\n\n this.debug && this.log.debug('processUpdateMessage', updateMessage);\n \n switch(updateMessage._) {\n case 'updatesTooLong':\n case 'new_session_created':\n this.forceGetDifference();\n break;\n \n case 'updateShort':\n this.processUpdate(updateMessage.update, processOpts);\n break;\n \n case 'updateShortMessage':\n case 'updateShortChatMessage': {\n assumeType<Updates.updateShortChatMessage | Updates.updateShortMessage>(updateMessage);\n this.debug && this.log.debug('updateShortMessage | updateShortChatMessage', {...updateMessage});\n const isOut = updateMessage.pFlags.out;\n const fromId = (updateMessage as Updates.updateShortChatMessage).from_id || (isOut ? rootScope.myId : (updateMessage as Updates.updateShortMessage).user_id);\n const toId = (updateMessage as Updates.updateShortChatMessage).chat_id\n ? (updateMessage as Updates.updateShortChatMessage).chat_id.toPeerId(true)\n : ((updateMessage as Updates.updateShortMessage).user_id.toPeerId(false) || rootScope.myId);\n \n this.processUpdate({\n _: 'updateNewMessage',\n message: {\n _: 'message',\n pFlags: updateMessage.pFlags,\n id: updateMessage.id,\n from_id: appPeersManager.getOutputPeer(fromId.toPeerId()),\n peer_id: appPeersManager.getOutputPeer(toId),\n date: updateMessage.date,\n message: updateMessage.message,\n fwd_from: updateMessage.fwd_from,\n reply_to: updateMessage.reply_to,\n entities: updateMessage.entities\n },\n pts: updateMessage.pts,\n pts_count: updateMessage.pts_count\n }, processOpts);\n break;\n }\n \n case 'updatesCombined':\n case 'updates':\n appUsersManager.saveApiUsers(updateMessage.users, options.override);\n appChatsManager.saveApiChats(updateMessage.chats, options.override);\n \n updateMessage.updates.forEach((update: Update) => {\n this.processUpdate(update, processOpts);\n });\n break;\n \n default:\n this.log.warn('Unknown update message', updateMessage);\n }\n };\n \n private getDifference(first = false): Promise<void> {\n // this.trace('Get full diff')\n const updatesState = this.updatesState;\n let wasSyncing = updatesState.syncLoading;\n if(!wasSyncing) {\n updatesState.pendingSeqUpdates = {};\n updatesState.pendingPtsUpdates = [];\n }\n \n if(updatesState.syncPending) {\n clearTimeout(updatesState.syncPending.timeout);\n updatesState.syncPending = null;\n }\n\n const promise = apiManager.invokeApi('updates.getDifference', {\n pts: updatesState.pts, \n pts_total_limit: first /* && false */? /* 50 */1200 : undefined,\n date: updatesState.date, \n qts: -1\n }, {\n timeout: 0x7fffffff\n }).then((differenceResult) => {\n this.debug && this.log.debug('Get diff result', differenceResult);\n\n if(differenceResult._ === 'updates.differenceEmpty') {\n this.debug && this.log.debug('apply empty diff', differenceResult.seq);\n updatesState.date = differenceResult.date;\n updatesState.seq = differenceResult.seq;\n return;\n }\n\n // ! SORRY I'M SORRY I'M SORRY\n if(first) {\n rootScope.dispatchEvent('state_synchronizing');\n }\n\n if(differenceResult._ !== 'updates.differenceTooLong') {\n appUsersManager.saveApiUsers(differenceResult.users);\n appChatsManager.saveApiChats(differenceResult.chats);\n\n // Should be first because of updateMessageID\n // this.log('applying', differenceResult.other_updates.length, 'other updates')\n \n differenceResult.other_updates.forEach((update) => {\n switch(update._) {\n case 'updateChannelTooLong':\n case 'updateNewChannelMessage':\n case 'updateEditChannelMessage':\n this.processUpdate(update);\n return;\n }\n \n this.saveUpdate(update);\n });\n\n // this.log('applying', differenceResult.new_messages.length, 'new messages')\n differenceResult.new_messages.forEach((apiMessage) => {\n this.saveUpdate({\n _: 'updateNewMessage',\n message: apiMessage,\n pts: updatesState.pts,\n pts_count: 0\n });\n });\n\n const nextState = differenceResult._ === 'updates.difference' ? differenceResult.state : differenceResult.intermediate_state;\n updatesState.seq = nextState.seq;\n updatesState.pts = nextState.pts;\n updatesState.date = nextState.date;\n } else {\n updatesState.pts = differenceResult.pts;\n updatesState.date = (Date.now() / 1000 | 0) + serverTimeManager.serverTimeOffset;\n delete updatesState.seq;\n \n this.channelStates = {};\n \n this.log.warn('getDifference:', differenceResult._);\n rootScope.dispatchEvent('state_cleared');\n }\n \n // this.log('apply diff', updatesState.seq, updatesState.pts)\n \n if(differenceResult._ === 'updates.differenceSlice') {\n return this.getDifference();\n } else {\n this.debug && this.log.debug('finished get diff');\n }\n });\n\n if(!wasSyncing) {\n this.justAName(updatesState, promise);\n }\n \n return promise;\n }\n\n private getChannelDifference(channelId: ChatId): Promise<void> {\n const channelState = this.getChannelState(channelId);\n const wasSyncing = channelState.syncLoading;\n if(!wasSyncing) {\n channelState.pendingPtsUpdates = [];\n }\n\n if(channelState.syncPending) {\n clearTimeout(channelState.syncPending.timeout);\n channelState.syncPending = null;\n }\n\n //this.log.trace('Get channel diff', appChatsManager.getChat(channelId), channelState.pts);\n const promise = apiManager.invokeApi('updates.getChannelDifference', {\n channel: appChatsManager.getChannelInput(channelId),\n filter: {_: 'channelMessagesFilterEmpty'},\n pts: channelState.pts,\n limit: 30\n }, {timeout: 0x7fffffff}).then((differenceResult) => {\n this.debug && this.log.debug('Get channel diff result', differenceResult)\n channelState.pts = 'pts' in differenceResult ? differenceResult.pts : undefined;\n \n if(differenceResult._ === 'updates.channelDifferenceEmpty') {\n this.debug && this.log.debug('apply channel empty diff', differenceResult);\n return;\n }\n \n if(differenceResult._ === 'updates.channelDifferenceTooLong') {\n this.debug && this.log.debug('channel diff too long', differenceResult);\n delete this.channelStates[channelId];\n\n this.saveUpdate({_: 'updateChannelReload', channel_id: channelId});\n return;\n }\n \n appUsersManager.saveApiUsers(differenceResult.users);\n appChatsManager.saveApiChats(differenceResult.chats);\n \n // Should be first because of updateMessageID\n this.debug && this.log.debug('applying', differenceResult.other_updates.length, 'channel other updates');\n differenceResult.other_updates.forEach((update) => {\n this.saveUpdate(update);\n });\n \n this.debug && this.log.debug('applying', differenceResult.new_messages.length, 'channel new messages');\n differenceResult.new_messages.forEach((apiMessage) => {\n this.saveUpdate({\n _: 'updateNewChannelMessage',\n message: apiMessage,\n pts: channelState.pts,\n pts_count: 0\n });\n });\n \n this.debug && this.log.debug('apply channel diff', channelState.pts);\n \n if(differenceResult._ === 'updates.channelDifference' &&\n !differenceResult.pFlags['final']) {\n return this.getChannelDifference(channelId);\n } else {\n this.debug && this.log.debug('finished channel get diff');\n }\n });\n\n if(!wasSyncing) {\n this.justAName(channelState, promise, channelId);\n }\n\n return promise;\n }\n\n private justAName(state: UpdatesState, promise: UpdatesState['syncLoading'], channelId?: ChatId) {\n state.syncLoading = promise;\n rootScope.dispatchEvent('state_synchronizing', channelId);\n\n promise.then(() => {\n state.syncLoading = null;\n rootScope.dispatchEvent('state_synchronized', channelId);\n }, () => {\n state.syncLoading = null;\n });\n }\n \n public addChannelState(channelId: ChatId, pts: number) {\n if(!pts) {\n throw new Error('Add channel state without pts ' + channelId);\n }\n\n if(!(channelId in this.channelStates)) {\n this.channelStates[channelId] = {\n pts,\n pendingPtsUpdates: [],\n syncPending: null,\n syncLoading: null\n };\n\n return true;\n }\n\n return false;\n }\n\n public getChannelState(channelId: ChatId, pts?: number) {\n if(this.channelStates[channelId] === undefined) {\n this.addChannelState(channelId, pts);\n }\n\n return this.channelStates[channelId];\n }\n\n private processUpdate(update: Update, options: Partial<{\n date: number,\n seq: number,\n seqStart: number/* ,\n ignoreSyncLoading: boolean */\n }> = {}) {\n let channelId: ChatId;\n switch(update._) {\n case 'updateNewChannelMessage':\n case 'updateEditChannelMessage':\n channelId = appPeersManager.getPeerId(update.message.peer_id).toChatId();\n break;\n /* case 'updateDeleteChannelMessages':\n channelId = update.channel_id;\n break; */\n case 'updateChannelTooLong':\n channelId = update.channel_id;\n if(!(channelId in this.channelStates)) {\n return false;\n }\n break;\n default:\n if('channel_id' in update && 'pts' in update) {\n channelId = update.channel_id;\n }\n break;\n }\n \n const {pts, pts_count} = update as Update.updateNewMessage;\n const curState = channelId ? this.getChannelState(channelId, pts) : this.updatesState;\n \n // this.log.log('process', channelId, curState.pts, update)\n \n if(curState.syncLoading/* && !options.ignoreSyncLoading */) {\n return false;\n }\n \n if(update._ === 'updateChannelTooLong') {\n if(!curState.lastPtsUpdateTime ||\n curState.lastPtsUpdateTime < (Date.now() - SYNC_DELAY)) {\n // this.log.trace('channel too long, get diff', channelId, update)\n this.getChannelDifference(channelId);\n }\n return false;\n }\n \n if(update._ === 'updateNewMessage' ||\n update._ === 'updateEditMessage' ||\n update._ === 'updateNewChannelMessage' ||\n update._ === 'updateEditChannelMessage') {\n const message = update.message as Message.message;\n const toPeerId = appPeersManager.getPeerId(message.peer_id);\n const fwdHeader: MessageFwdHeader.messageFwdHeader = message.fwd_from || {} as any;\n let reason: string;\n if(message.from_id && !appUsersManager.hasUser(appPeersManager.getPeerId(message.from_id), message.pFlags.post/* || channelId*/) && (reason = 'author') ||\n fwdHeader.from_id && !appUsersManager.hasUser(appPeersManager.getPeerId(fwdHeader.from_id), !!(fwdHeader.from_id as Peer.peerChannel).channel_id) && (reason = 'fwdAuthor') ||\n (fwdHeader.from_id as Peer.peerChannel)?.channel_id && !appChatsManager.hasChat((fwdHeader.from_id as Peer.peerChannel).channel_id, true) && (reason = 'fwdChannel') ||\n toPeerId.isUser() && !appUsersManager.hasUser(toPeerId) && (reason = 'toPeer User') ||\n toPeerId.isAnyChat() && !appChatsManager.hasChat(toPeerId.toChatId()) && (reason = 'toPeer Chat')) {\n this.log.warn('Not enough data for message update', toPeerId, reason, message);\n if(channelId && appChatsManager.hasChat(channelId)) {\n this.getChannelDifference(channelId);\n } else {\n this.forceGetDifference();\n }\n return false;\n }\n } else if(channelId && !appChatsManager.hasChat(channelId)) {\n // this.log.log('skip update, missing channel', channelId, update)\n return false;\n }\n \n let popPts: boolean;\n let popSeq: boolean;\n \n if(pts) {\n const newPts = curState.pts + (pts_count || 0);\n if(newPts < pts) {\n this.debug && this.log.warn('Pts hole', curState, update, channelId && appChatsManager.getChat(channelId));\n curState.pendingPtsUpdates.push(update as Update.updateNewMessage);\n if(!curState.syncPending && !curState.syncLoading) {\n curState.syncPending = {\n timeout: window.setTimeout(() => {\n curState.syncPending = null;\n\n if(curState.syncLoading) {\n return;\n }\n\n if(channelId) {\n this.getChannelDifference(channelId);\n } else {\n this.getDifference();\n }\n }, SYNC_DELAY)\n };\n }\n\n curState.syncPending.ptsAwaiting = true;\n return false;\n }\n\n if(pts > curState.pts) {\n curState.pts = pts;\n popPts = true;\n \n curState.lastPtsUpdateTime = Date.now();\n } else if(pts_count) {\n // this.log.warn('Duplicate update', update)\n return false;\n }\n\n if(channelId && options.date && this.updatesState.date < options.date) {\n this.updatesState.date = options.date;\n }\n } else if(!channelId && options.seq > 0) {\n const seq = options.seq;\n const seqStart = options.seqStart || seq;\n \n if(seqStart !== curState.seq + 1) {\n if(seqStart > curState.seq) {\n this.debug && this.log.warn('Seq hole', curState, curState.syncPending && curState.syncPending.seqAwaiting);\n \n if(curState.pendingSeqUpdates[seqStart] === undefined) {\n curState.pendingSeqUpdates[seqStart] = {seq, date: options.date, updates: []};\n }\n curState.pendingSeqUpdates[seqStart].updates.push(update);\n \n if(!curState.syncPending) {\n curState.syncPending = {\n timeout: window.setTimeout(() => {\n curState.syncPending = null;\n\n if(curState.syncLoading) {\n return;\n }\n\n this.getDifference();\n }, SYNC_DELAY)\n };\n }\n\n if(!curState.syncPending.seqAwaiting ||\n curState.syncPending.seqAwaiting < seqStart) {\n curState.syncPending.seqAwaiting = seqStart;\n }\n return false;\n }\n }\n \n if(curState.seq !== seq) {\n curState.seq = seq;\n if(options.date && curState.date < options.date) {\n curState.date = options.date;\n }\n\n popSeq = true;\n }\n }\n \n this.saveUpdate(update);\n \n if(popPts) {\n this.popPendingPtsUpdate(channelId);\n } else if(popSeq) {\n this.popPendingSeqUpdate();\n }\n }\n\n public saveUpdate(update: Update) {\n //this.debug && this.log('saveUpdate', update);\n rootScope.dispatchEvent(update._, update as any);\n }\n \n public attach() {\n if(this.attached) return;\n\n //return;\n\n this.log('attach');\n \n this.attached = true;\n\n appStateManager.getState().then(({updates: state}) => {\n const newVersion = appStateManager.newVersion/* || '0.8.6' */;\n\n //rootScope.broadcast('state_synchronizing');\n if(!state || !state.pts || !state.date/* || !state.seq */) { // seq can be undefined because of updates.differenceTooLong\n this.log('will get new state');\n\n this.updatesState.syncLoading = new Promise((resolve) => {\n apiManager.invokeApi('updates.getState', {}, {noErrorBox: true}).then((stateResult) => {\n this.updatesState.seq = stateResult.seq;\n this.updatesState.pts = stateResult.pts;\n this.updatesState.date = stateResult.date;\n this.saveUpdatesState();\n //setTimeout(() => {\n this.updatesState.syncLoading = null;\n resolve();\n //rootScope.broadcast('state_synchronized');\n //}, 1000);\n \n // ! for testing\n // updatesState.seq = 1\n // updatesState.pts = stateResult.pts - 5000\n // updatesState.date = 1\n // getDifference()\n });\n });\n } else {\n // ! for testing\n /* state.seq = 1;\n state.pts = state.pts - 15;\n state.date = 1; */\n // state.pts -= 100;\n\n /* state.date = 1628623682;\n state.pts = 2007500;\n state.seq = 503; */\n\n Object.assign(this.updatesState, state);\n \n this.log('will get difference', Object.assign({}, state));\n \n this.getDifference(true)/* .finally(() => {\n if(this.updatesState.syncLoading) {\n rootScope.broadcast('state_synchronizing');\n }\n }) */;\n }\n\n apiManager.setUpdatesProcessor(this.processUpdateMessage);\n\n // this.updatesState.syncLoading.then(() => {\n this.setProxy();\n // });\n\n if(newVersion) {\n this.updatesState.syncLoading.then(() => {\n fetch('changelogs/' + newVersion.split(' ')[0] + '.md')\n .then(res => (res.status === 200 && res.ok && res.text()) || Promise.reject())\n .then(text => {\n const pre = `**Telegram Web${App.suffix} was updated to version alpha ${newVersion}**\\n\\n`;\n\n text = pre + text;\n\n const entities: MessageEntity[] = [];\n const message = RichTextProcessor.parseMarkdown(text, entities);\n\n const update: Update.updateServiceNotification = {\n _: 'updateServiceNotification',\n entities,\n message,\n type: 'local',\n pFlags: {},\n inbox_date: Date.now() / 1000 | 0,\n media: undefined\n };\n this.processLocalUpdate(update);\n })\n .catch(noop);\n });\n }\n });\n }\n}\n\nconst apiUpdatesManager = new ApiUpdatesManager();\nMOUNT_CLASS_TO.apiUpdatesManager = apiUpdatesManager;\nexport default apiUpdatesManager\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov <igor.beatle@gmail.com>\n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport { FileURLType, getFileNameByLocation, getFileURL } from '../../helpers/fileName';\nimport { safeReplaceArrayInObject, defineNotNumerableProperties, isObject } from '../../helpers/object';\nimport { Document, InputFileLocation, InputMedia, PhotoSize } from '../../layer';\nimport referenceDatabase, { ReferenceContext } from '../mtproto/referenceDatabase';\nimport opusDecodeController from '../opusDecodeController';\nimport { RichTextProcessor } from '../richtextprocessor';\nimport appDownloadManager, { DownloadBlob } from './appDownloadManager';\nimport appPhotosManager from './appPhotosManager';\nimport blur from '../../helpers/blur';\nimport apiManager from '../mtproto/mtprotoworker';\nimport { MOUNT_CLASS_TO } from '../../config/debug';\nimport { getFullDate } from '../../helpers/date';\nimport rootScope from '../rootScope';\nimport IS_WEBP_SUPPORTED from '../../environment/webpSupport';\n\nexport type MyDocument = Document.document;\n\n// TODO: если залить картинку файлом, а потом перезайти в диалог - превьюшка заново скачается\n\nconst EXTENSION_MIME_TYPE_MAP = {\n mov: 'video/quicktime',\n gif: 'image/gif',\n pdf: 'application/pdf',\n};\n\nexport class AppDocsManager {\n private docs: {[docId: DocId]: MyDocument} = {};\n private savingLottiePreview: {[docId: DocId]: true} = {};\n public downloading: Map<DocId, DownloadBlob> = new Map();\n\n constructor() {\n apiManager.onServiceWorkerFail = this.onServiceWorkerFail;\n }\n\n public onServiceWorkerFail = () => {\n for(const id in this.docs) {\n const doc = this.docs[id];\n\n if(doc.supportsStreaming) {\n delete doc.supportsStreaming;\n const cacheContext = appDownloadManager.getCacheContext(doc);\n delete cacheContext.url;\n }\n }\n };\n\n public saveDoc(doc: Document, context?: ReferenceContext): MyDocument {\n if(doc._ === 'documentEmpty') {\n return undefined;\n }\n\n const oldDoc = this.docs[doc.id];\n\n if(doc.file_reference) { // * because we can have a new object w/o the file_reference while sending\n safeReplaceArrayInObject('file_reference', oldDoc, doc);\n referenceDatabase.saveContext(doc.file_reference, context);\n }\n \n //console.log('saveDoc', apiDoc, this.docs[apiDoc.id]);\n // if(oldDoc) {\n // //if(doc._ !== 'documentEmpty' && doc._ === d._) {\n // if(doc.thumbs) {\n // if(!oldDoc.thumbs) oldDoc.thumbs = doc.thumbs;\n // /* else if(apiDoc.thumbs[0].bytes && !d.thumbs[0].bytes) {\n // d.thumbs.unshift(apiDoc.thumbs[0]);\n // } else if(d.thumbs[0].url) { // fix for converted thumb in safari\n // apiDoc.thumbs[0] = d.thumbs[0];\n // } */\n // }\n\n // //}\n\n // return oldDoc;\n\n // //return Object.assign(d, apiDoc, context);\n // //return context ? Object.assign(d, context) : d;\n // }\n\n if(!oldDoc) {\n this.docs[doc.id] = doc;\n }\n\n // * exclude from state\n // defineNotNumerableProperties(doc, [/* 'thumbs', */'type', 'h', 'w', 'file_name', \n // 'file', 'duration', 'downloaded', 'url', 'audioTitle', \n // 'audioPerformer', 'sticker', 'stickerEmoji', 'stickerEmojiRaw', \n // 'stickerSetInput', 'stickerThumbConverted', 'animated', 'supportsStreaming']);\n\n doc.attributes.forEach(attribute => {\n switch(attribute._) {\n case 'documentAttributeFilename':\n doc.file_name = RichTextProcessor.wrapPlainText(attribute.file_name);\n doc.fileName = RichTextProcessor.wrapEmojiText(attribute.file_name);\n break;\n\n case 'documentAttributeAudio':\n doc.duration = attribute.duration;\n doc.audioTitle = RichTextProcessor.wrapEmojiText(attribute.title);\n doc.audioPerformer = RichTextProcessor.wrapEmojiText(attribute.performer);\n doc.type = attribute.pFlags.voice && doc.mime_type === 'audio/ogg' ? 'voice' : 'audio';\n /* if(apiDoc.type === 'audio') {\n apiDoc.supportsStreaming = true;\n } */\n break;\n\n case 'documentAttributeVideo':\n doc.duration = attribute.duration;\n doc.w = attribute.w;\n doc.h = attribute.h;\n //apiDoc.supportsStreaming = attribute.pFlags?.supports_streaming/* && apiDoc.size > 524288 */;\n if(/* apiDoc.thumbs && */attribute.pFlags.round_message) {\n doc.type = 'round';\n } else /* if(apiDoc.thumbs) */ {\n doc.type = 'video';\n }\n break;\n\n case 'documentAttributeSticker':\n if(attribute.alt !== undefined) {\n doc.stickerEmojiRaw = attribute.alt;\n doc.stickerEmoji = RichTextProcessor.wrapRichText(doc.stickerEmojiRaw, {noLinks: true, noLinebreaks: true});\n }\n\n if(attribute.stickerset) {\n if(attribute.stickerset._ === 'inputStickerSetEmpty') {\n delete attribute.stickerset;\n } else if(attribute.stickerset._ === 'inputStickerSetID') {\n doc.stickerSetInput = attribute.stickerset;\n }\n }\n\n // * there can be no thumbs, then it is a document\n if(/* apiDoc.thumbs && */doc.mime_type === 'image/webp' && (doc.thumbs || IS_WEBP_SUPPORTED)) {\n doc.type = 'sticker';\n doc.sticker = 1;\n }\n break;\n\n case 'documentAttributeImageSize':\n doc.type = 'photo';\n doc.w = attribute.w;\n doc.h = attribute.h;\n break;\n\n case 'documentAttributeAnimated':\n if((doc.mime_type === 'image/gif' || doc.mime_type === 'video/mp4')/* && apiDoc.thumbs */) {\n doc.type = 'gif';\n }\n\n doc.animated = true;\n break;\n }\n });\n \n if(!doc.mime_type) {\n const ext = (doc.file_name || '').split('.').pop();\n // @ts-ignore\n const mappedMimeType = ext && EXTENSION_MIME_TYPE_MAP[ext.toLowerCase()];\n if(mappedMimeType) {\n doc.mime_type = mappedMimeType;\n } else {\n switch(doc.type) {\n case 'gif':\n case 'video':\n case 'round':\n doc.mime_type = 'video/mp4';\n break;\n case 'sticker':\n doc.mime_type = 'image/webp';\n break;\n case 'audio':\n doc.mime_type = 'audio/mpeg';\n break;\n case 'voice':\n doc.mime_type = 'audio/ogg';\n break;\n default:\n doc.mime_type = 'application/octet-stream';\n break;\n }\n }\n } else if(doc.mime_type === EXTENSION_MIME_TYPE_MAP.pdf) {\n doc.type = 'pdf';\n } else if(doc.mime_type === EXTENSION_MIME_TYPE_MAP.gif) {\n doc.type = 'gif';\n }\n\n if(doc.type === 'voice' || doc.type === 'round') {\n // browser will identify extension\n doc.file_name = doc.fileName = doc.type + '_' + getFullDate(new Date(doc.date * 1000), {monthAsNumber: true, leadingZero: true}).replace(/[:\\.]/g, '-').replace(', ', '_');\n }\n\n if(apiManager.isServiceWorkerOnline()) {\n if((doc.type === 'gif' && doc.size > 8e6) || doc.type === 'audio' || doc.type === 'video'/* || doc.mime_type.indexOf('video/') === 0 */) {\n doc.supportsStreaming = true;\n \n const cacheContext = appDownloadManager.getCacheContext(doc);\n if(!cacheContext.url) {\n cacheContext.url = this.getFileURL(doc);\n }\n }\n }\n\n // for testing purposes\n // doc.supportsStreaming = false;\n // doc.url = ''; // * this will break upload urls\n \n if(!doc.file_name) {\n doc.file_name = doc.fileName = '';\n }\n\n if(doc.mime_type === 'application/x-tgsticker' && doc.file_name === 'AnimatedSticker.tgs') {\n doc.type = 'sticker';\n doc.animated = true;\n doc.sticker = 2;\n }\n\n /* if(!doc.url) {\n doc.url = this.getFileURL(doc);\n } */\n\n if(oldDoc) {\n return Object.assign(oldDoc, doc);\n }\n\n return doc;\n }\n \n public getDoc(docId: DocId | MyDocument): MyDocument {\n return isObject<MyDocument>(docId) ? docId : this.docs[docId];\n }\n\n public getMediaInput(doc: MyDocument): InputMedia.inputMediaDocument {\n return {\n _: 'inputMediaDocument',\n id: {\n _: 'inputDocument',\n id: doc.id,\n access_hash: doc.access_hash,\n file_reference: doc.file_reference\n },\n ttl_seconds: 0\n };\n }\n\n public getInput(doc: MyDocument, thumbSize?: string): InputFileLocation.inputDocumentFileLocation {\n return {\n _: 'inputDocumentFileLocation',\n id: doc.id,\n access_hash: doc.access_hash,\n file_reference: doc.file_reference,\n thumb_size: thumbSize\n };\n }\n\n public getFileDownloadOptions(doc: MyDocument, thumb?: PhotoSize.photoSize, queueId?: number, onlyCache?: boolean) {\n const inputFileLocation = this.getInput(doc, thumb?.type);\n\n let mimeType: string;\n if(thumb) {\n mimeType = doc.sticker ? 'image/webp' : 'image/jpeg'/* doc.mime_type */;\n } else {\n mimeType = doc.mime_type || 'application/octet-stream';\n }\n\n return {\n dcId: doc.dc_id, \n location: inputFileLocation, \n size: thumb ? thumb.size : doc.size, \n mimeType,\n fileName: doc.file_name,\n queueId,\n onlyCache\n };\n }\n\n public getFileURL(doc: MyDocument, download = false, thumb?: PhotoSize.photoSize) {\n let type: FileURLType;\n if(download) {\n type = 'download';\n } else if(thumb) {\n type = 'thumb';\n } else if(doc.supportsStreaming) {\n type = 'stream';\n } else {\n type = 'document';\n }\n\n return getFileURL(type, this.getFileDownloadOptions(doc, thumb));\n }\n\n public getThumbURL(doc: MyDocument, thumb: PhotoSize.photoSize | PhotoSize.photoCachedSize | PhotoSize.photoStrippedSize) {\n let promise: Promise<any> = Promise.resolve();\n\n const cacheContext = appDownloadManager.getCacheContext(doc, thumb.type);\n if(!cacheContext.url) {\n if('bytes' in thumb) {\n promise = blur(appPhotosManager.getPreviewURLFromBytes(thumb.bytes, !!doc.sticker)).then(url => {\n cacheContext.url = url;\n }) as any;\n } else {\n //return this.getFileURL(doc, false, thumb);\n promise = appPhotosManager.preloadPhoto(doc, thumb) as any;\n }\n }\n\n return {thumb, cacheContext, promise};\n }\n\n public getThumb(doc: MyDocument, tryNotToUseBytes = true) {\n const thumb = appPhotosManager.choosePhotoSize(doc, 0, 0, !tryNotToUseBytes);\n if(thumb._ === 'photoSizeEmpty') return null;\n return this.getThumbURL(doc, thumb as any);\n }\n\n public getInputFileName(doc: MyDocument, thumbSize?: string) {\n return getFileNameByLocation(this.getInput(doc, thumbSize), {fileName: doc.file_name});\n }\n\n public downloadDoc(doc: MyDocument, queueId?: number, onlyCache?: boolean): DownloadBlob {\n const fileName = this.getInputFileName(doc);\n\n let download: DownloadBlob = appDownloadManager.getDownload(fileName);\n if(download) {\n return download;\n }\n\n const downloadOptions = this.getFileDownloadOptions(doc, undefined, queueId, onlyCache);\n download = appDownloadManager.download(downloadOptions);\n this.downloading.set(doc.id, download);\n rootScope.dispatchEvent('download_start', doc.id);\n\n const cacheContext = appDownloadManager.getCacheContext(doc);\n const originalPromise = download;\n originalPromise.then((blob) => {\n cacheContext.url = URL.createObjectURL(blob);\n cacheContext.downloaded = blob.size;\n }, () => {}).finally(() => {\n this.downloading.delete(doc.id);\n });\n \n if(doc.type === 'voice' && !opusDecodeController.isPlaySupported()) {\n download = originalPromise.then(async(blob) => {\n const reader = new FileReader();\n \n await new Promise<void>((resolve, reject) => {\n reader.onloadend = (e) => {\n const uint8 = new Uint8Array(e.target.result as ArrayBuffer);\n //console.log('sending uint8 to decoder:', uint8);\n opusDecodeController.decode(uint8).then(result => {\n cacheContext.url = result.url;\n resolve();\n }, (err) => {\n delete cacheContext.downloaded;\n reject(err);\n });\n };\n \n reader.readAsArrayBuffer(blob);\n });\n \n return blob;\n });\n }\n\n download.then(() => {\n rootScope.dispatchEvent('document_downloaded', doc);\n });\n\n return download;\n }\n\n public saveLottiePreview(doc: MyDocument, canvas: HTMLCanvasElement, toneIndex: number) {\n const key = doc.id + '-' + toneIndex;\n if(this.savingLottiePreview[key]/* || true */) return;\n\n if(!doc.stickerCachedThumbs) {\n defineNotNumerableProperties(doc, ['stickerCachedThumbs']);\n doc.stickerCachedThumbs = {};\n }\n\n const thumb = doc.stickerCachedThumbs[toneIndex];\n if(thumb && thumb.w >= canvas.width && thumb.h >= canvas.height) {\n return;\n }\n\n /* if(doc.thumbs.find(t => t._ === 'photoStrippedSize') \n || (doc.stickerCachedThumb || (doc.stickerSavedThumbWidth >= canvas.width && doc.stickerSavedThumbHeight >= canvas.height))) {\n return;\n } */\n\n this.savingLottiePreview[key] = true;\n canvas.toBlob((blob) => {\n //console.log('got lottie preview', doc, blob, URL.createObjectURL(blob));\n\n const thumb = {\n url: URL.createObjectURL(blob),\n w: canvas.width,\n h: canvas.height\n };\n\n doc.stickerCachedThumbs[toneIndex] = thumb;\n\n delete this.savingLottiePreview[key];\n \n /* const reader = new FileReader();\n reader.onloadend = (e) => {\n const uint8 = new Uint8Array(e.target.result as ArrayBuffer);\n const thumb: PhotoSize.photoStrippedSize = {\n _: 'photoStrippedSize',\n bytes: uint8,\n type: 'i'\n };\n\n doc.stickerSavedThumbWidth = canvas.width;\n doc.stickerSavedThumbHeight = canvas.width;\n\n defineNotNumerableProperties(thumb, ['url']);\n thumb.url = URL.createObjectURL(blob);\n doc.thumbs.findAndSplice(t => t._ === thumb._);\n doc.thumbs.unshift(thumb);\n\n if(!webpWorkerController.isWebpSupported()) {\n doc.pFlags.stickerThumbConverted = true;\n }\n\n delete this.savingLottiePreview[doc.id];\n };\n reader.readAsArrayBuffer(blob); */\n });\n }\n\n public saveDocFile(doc: MyDocument, queueId?: number) {\n /* const options = this.getFileDownloadOptions(doc, undefined, queueId);\n return appDownloadManager.downloadToDisc(options, doc.file_name); */\n const promise = this.downloadDoc(doc, queueId);\n promise.then(() => {\n const cacheContext = appDownloadManager.getCacheContext(doc);\n appDownloadManager.createDownloadAnchor(cacheContext.url, doc.file_name);\n });\n return promise;\n }\n}\n\nconst appDocsManager = new AppDocsManager();\nMOUNT_CLASS_TO.appDocsManager = appDocsManager;\nexport default appDocsManager;\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov <igor.beatle@gmail.com>\r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport type { ApplyServerTimeOffsetTask } from './timeManager';\r\nimport { MOUNT_CLASS_TO } from '../../config/debug';\r\n// import { tsNow } from '../../helpers/date';\r\nimport sessionStorage from '../sessionStorage';\r\nimport apiManager from './mtprotoworker';\r\n\r\nexport class ServerTimeManager {\r\n /* private midnightNoOffset: number;\r\n private midnightOffseted: Date;\r\n\r\n private midnightOffset: number; */\r\n\r\n public serverTimeOffset: number; // in seconds\r\n /* private timeParams: {\r\n midnightOffset: number,\r\n serverTimeOffset: number\r\n }; */\r\n\r\n constructor() {\r\n /* const timestampNow = tsNow(true);\r\n this.midnightNoOffset = timestampNow - (timestampNow % 86400);\r\n this.midnightOffseted = new Date();\r\n this.midnightOffseted.setHours(0, 0, 0, 0);\r\n \r\n this.midnightOffset = this.midnightNoOffset - (Math.floor(+this.midnightOffseted / 1000)); */\r\n\r\n this.serverTimeOffset = 0;\r\n /* this.timeParams = {\r\n midnightOffset: this.midnightOffset,\r\n serverTimeOffset: this.serverTimeOffset\r\n }; */\r\n\r\n sessionStorage.get('server_time_offset').then((to) => {\r\n if(to) {\r\n this.serverTimeOffset = to;\r\n // this.timeParams.serverTimeOffset = to;\r\n }\r\n });\r\n\r\n apiManager.addTaskListener('applyServerTimeOffset', (task: ApplyServerTimeOffsetTask) => {\r\n this.serverTimeOffset = task.payload;\r\n });\r\n }\r\n}\r\n\r\nconst serverTimeManager = new ServerTimeManager();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.serverTimeManager = serverTimeManager);\r\nexport default serverTimeManager;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\ntype TargetType = HTMLElement;\r\nexport type OnVisibilityChange = (target: TargetType, visible: boolean) => void;\r\n\r\nexport default class VisibilityIntersector {\r\n private observer: IntersectionObserver;\r\n private items: Map<TargetType, boolean> = new Map();\r\n private locked = false;\r\n\r\n constructor(onVisibilityChange: OnVisibilityChange) {\r\n this.observer = new IntersectionObserver((entries) => {\r\n if(this.locked) {\r\n return;\r\n }\r\n\r\n const changed: {target: TargetType, visible: boolean}[] = [];\r\n\r\n entries.forEach(entry => {\r\n const target = entry.target as TargetType;\r\n\r\n if(this.items.get(target) === entry.isIntersecting) {\r\n return;\r\n } else {\r\n this.items.set(target, entry.isIntersecting);\r\n }\r\n\r\n /* if(entry.isIntersecting) {\r\n console.log('ooo', entry);\r\n } */\r\n\r\n /* if(this.locked) {\r\n return;\r\n } */\r\n\r\n changed[entry.isIntersecting ? 'unshift' : 'push']({target, visible: entry.isIntersecting});\r\n\r\n //onVisibilityChange(target, entry.isIntersecting);\r\n });\r\n\r\n changed.forEach(smth => {\r\n onVisibilityChange(smth.target, smth.visible);\r\n });\r\n });\r\n }\r\n\r\n public getVisible() {\r\n const items: TargetType[] = [];\r\n this.items.forEach((value, key) => {\r\n if(value) {\r\n items.push(key);\r\n }\r\n });\r\n\r\n return items;\r\n }\r\n\r\n public clearVisible() {\r\n const visible = this.getVisible();\r\n for(const target of visible) {\r\n this.items.set(target, false);\r\n }\r\n }\r\n\r\n public isVisible(target: TargetType) {\r\n return this.items.get(target);\r\n }\r\n\r\n public disconnect() {\r\n this.observer.disconnect();\r\n this.items.clear();\r\n }\r\n\r\n public refresh() {\r\n this.observer.disconnect();\r\n\r\n //window.requestAnimationFrame(() => {\r\n const targets = [...this.items.keys()];\r\n for(const target of targets) {\r\n //this.items.set(target, false);\r\n this.observer.observe(target);\r\n }\r\n //});\r\n }\r\n\r\n public refreshVisible() {\r\n const visible = this.getVisible();\r\n for(const target of visible) {\r\n this.observer.unobserve(target);\r\n }\r\n\r\n for(const target of visible) {\r\n this.observer.observe(target);\r\n }\r\n }\r\n\r\n public observe(target: TargetType) {\r\n this.items.set(target, false);\r\n this.observer.observe(target);\r\n }\r\n\r\n public unobserve(target: TargetType) {\r\n this.observer.unobserve(target);\r\n this.items.delete(target);\r\n }\r\n\r\n public unlock() {\r\n this.locked = false;\r\n }\r\n\r\n public unlockAndRefresh() {\r\n this.unlock();\r\n this.refresh();\r\n }\r\n\r\n public lock() {\r\n this.locked = true;\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { logger, LogTypes } from \"../lib/logger\";\r\nimport VisibilityIntersector, { OnVisibilityChange } from \"./visibilityIntersector\";\r\nimport { findAndSpliceAll, indexOfAndSplice } from \"../helpers/array\";\r\nimport throttle from \"../helpers/schedulers/throttle\";\r\n\r\ntype LazyLoadElementBase = {\r\n load: () => Promise<any>\r\n};\r\n\r\ntype LazyLoadElement = Omit<LazyLoadElementBase, 'load'> & {\r\n load: (target?: HTMLElement) => Promise<any>,\r\n div: HTMLElement\r\n wasSeen?: boolean,\r\n};\r\n\r\nconst PARALLEL_LIMIT = 8;\r\n\r\nexport class LazyLoadQueueBase {\r\n public queueId = 0;\r\n protected queue: Array<LazyLoadElementBase> = [];\r\n protected inProcess: Set<LazyLoadElementBase> = new Set();\r\n\r\n protected lockPromise: Promise<void> = null;\r\n protected unlockResolve: () => void = null;\r\n\r\n protected log = logger('LL', LogTypes.Error);\r\n protected processQueue: () => void;\r\n\r\n constructor(protected parallelLimit = PARALLEL_LIMIT) {\r\n this.processQueue = throttle(() => this._processQueue(), 20, false);\r\n }\r\n\r\n public clear() {\r\n this.inProcess.clear(); // ацтеки забьются, будет плохо\r\n\r\n this.queue.length = 0;\r\n // unreachable code\r\n /* for(let item of this.inProcess) { \r\n this.lazyLoadMedia.push(item);\r\n } */\r\n }\r\n\r\n public lock() {\r\n if(this.lockPromise) return;\r\n\r\n //const perf = performance.now();\r\n this.lockPromise = new Promise((resolve, reject) => {\r\n this.unlockResolve = resolve;\r\n });\r\n\r\n /* if(DEBUG) {\r\n this.lockPromise.then(() => {\r\n this.log('was locked for:', performance.now() - perf);\r\n });\r\n } */\r\n }\r\n\r\n public unlock() {\r\n if(!this.unlockResolve) return;\r\n\r\n this.unlockResolve();\r\n this.unlockResolve = this.lockPromise = null;\r\n\r\n this.processQueue();\r\n }\r\n\r\n protected async processItem(item: LazyLoadElementBase) {\r\n if(this.lockPromise) {\r\n return;\r\n }\r\n\r\n this.inProcess.add(item);\r\n\r\n /* if(DEBUG) {\r\n this.log('will load media', this.lockPromise, item);\r\n } */\r\n\r\n try {\r\n //await new Promise((resolve) => setTimeout(resolve, 2e3));\r\n //await new Promise((resolve, reject) => window.requestAnimationFrame(() => window.requestAnimationFrame(resolve)));\r\n //await item.load(item.div);\r\n await this.loadItem(item);\r\n } catch(err) {\r\n if(!['NO_ENTRY_FOUND', 'STORAGE_OFFLINE'].includes(err as string)) {\r\n this.log.error('loadMediaQueue error:', err/* , item */);\r\n }\r\n }\r\n\r\n this.inProcess.delete(item);\r\n\r\n /* if(DEBUG) {\r\n this.log('loaded media', item);\r\n } */\r\n\r\n this.processQueue();\r\n }\r\n\r\n protected loadItem(item: LazyLoadElementBase) {\r\n return item.load();\r\n }\r\n\r\n protected getItem() {\r\n return this.queue.shift();\r\n }\r\n\r\n protected addElement(method: 'push' | 'unshift', el: LazyLoadElementBase) {\r\n this.queue[method](el);\r\n this.processQueue();\r\n }\r\n\r\n protected _processQueue(item?: LazyLoadElementBase) {\r\n if(!this.queue.length || this.lockPromise || (this.parallelLimit > 0 && this.inProcess.size >= this.parallelLimit)) return;\r\n\r\n //console.log('_processQueue start');\r\n let added = 0;\r\n do {\r\n if(item) {\r\n indexOfAndSplice(this.queue, item);\r\n } else {\r\n item = this.getItem();\r\n }\r\n \r\n if(item) {\r\n this.processItem(item);\r\n } else {\r\n break;\r\n }\r\n\r\n item = null;\r\n ++added;\r\n } while(this.inProcess.size < this.parallelLimit && this.queue.length);\r\n //console.log('_processQueue end, added', added, this.queue.length);\r\n }\r\n\r\n public push(el: LazyLoadElementBase) {\r\n this.addElement('push', el);\r\n }\r\n\r\n public unshift(el: LazyLoadElementBase) {\r\n this.addElement('unshift', el);\r\n }\r\n}\r\n\r\nexport class LazyLoadQueueIntersector extends LazyLoadQueueBase {\r\n protected queue: Array<LazyLoadElement> = [];\r\n protected inProcess: Set<LazyLoadElement> = new Set();\r\n\r\n public intersector: VisibilityIntersector;\r\n protected intersectorTimeout: number;\r\n\r\n constructor(protected parallelLimit = PARALLEL_LIMIT) {\r\n super(parallelLimit);\r\n }\r\n\r\n public lock() {\r\n super.lock();\r\n this.intersector.lock();\r\n }\r\n\r\n public unlock() {\r\n super.unlock();\r\n this.intersector.unlock();\r\n }\r\n\r\n public unlockAndRefresh() {\r\n super.unlock();\r\n this.intersector.unlockAndRefresh();\r\n }\r\n\r\n public clear() {\r\n super.clear();\r\n this.intersector.disconnect();\r\n }\r\n\r\n public refresh() {\r\n this.intersector.refresh();\r\n }\r\n\r\n protected loadItem(item: LazyLoadElement) {\r\n return item.load(item.div);\r\n }\r\n\r\n protected addElement(method: 'push' | 'unshift', el: LazyLoadElement) {\r\n const item = this.queue.find(i => i.div === el.div && i.load === el.load);\r\n if(item) {\r\n return false;\r\n } else {\r\n for(const item of this.inProcess) {\r\n if(item.div === el.div && item.load === el.load) {\r\n return false;\r\n }\r\n }\r\n }\r\n\r\n this.queue[method](el);\r\n return true;\r\n }\r\n\r\n protected setProcessQueueTimeout() {\r\n if(!this.intersectorTimeout) {\r\n this.intersectorTimeout = window.setTimeout(() => {\r\n this.intersectorTimeout = 0;\r\n this.processQueue();\r\n }, 0);\r\n }\r\n }\r\n\r\n public push(el: LazyLoadElement) {\r\n super.push(el);\r\n }\r\n\r\n public unshift(el: LazyLoadElement) {\r\n super.unshift(el);\r\n }\r\n\r\n public unobserve(el: HTMLElement) {\r\n findAndSpliceAll(this.queue, (i) => i.div === el);\r\n\r\n this.intersector.unobserve(el);\r\n }\r\n}\r\n\r\nexport default class LazyLoadQueue extends LazyLoadQueueIntersector {\r\n constructor(protected parallelLimit = PARALLEL_LIMIT) {\r\n super(parallelLimit);\r\n\r\n this.intersector = new VisibilityIntersector(this.onVisibilityChange);\r\n }\r\n\r\n private onVisibilityChange = (target: HTMLElement, visible: boolean) => {\r\n if(visible) {\r\n /* if(DEBUG) {\r\n this.log('isIntersecting', target);\r\n } */\r\n\r\n // need for set element first if scrolled\r\n findAndSpliceAll(this.queue, (i) => i.div === target).forEach(item => {\r\n item.wasSeen = true;\r\n this.queue.unshift(item);\r\n //this.processQueue(item);\r\n });\r\n\r\n this.setProcessQueueTimeout();\r\n }\r\n };\r\n\r\n protected getItem() {\r\n return this.queue.findAndSplice(item => item.wasSeen);\r\n }\r\n\r\n public async processItem(item: LazyLoadElement) {\r\n await super.processItem(item);\r\n this.intersector.unobserve(item.div);\r\n }\r\n\r\n protected addElement(method: 'push' | 'unshift', el: LazyLoadElement) {\r\n const inserted = super.addElement(method, el);\r\n\r\n if(!inserted) return false;\r\n\r\n this.intersector.observe(el.div);\r\n /* if(el.wasSeen) {\r\n this.processQueue(el);\r\n } else */if(!el.hasOwnProperty('wasSeen')) {\r\n el.wasSeen = false;\r\n }\r\n \r\n return true;\r\n }\r\n}\r\n\r\nexport class LazyLoadQueueRepeat extends LazyLoadQueueIntersector {\r\n private _queue: Map<HTMLElement, LazyLoadElement> = new Map();\r\n\r\n constructor(protected parallelLimit = PARALLEL_LIMIT, protected onVisibilityChange?: OnVisibilityChange) {\r\n super(parallelLimit);\r\n\r\n this.intersector = new VisibilityIntersector((target, visible) => {\r\n const spliced = findAndSpliceAll(this.queue, (i) => i.div === target);\r\n if(visible) {\r\n const items = spliced.length ? spliced : [this._queue.get(target)];\r\n items.forEach(item => {\r\n this.queue.unshift(item || this._queue.get(target));\r\n });\r\n }\r\n \r\n this.onVisibilityChange && this.onVisibilityChange(target, visible);\r\n this.setProcessQueueTimeout();\r\n });\r\n }\r\n\r\n public clear() {\r\n super.clear();\r\n this._queue.clear();\r\n }\r\n\r\n /* public async processItem(item: LazyLoadElement) {\r\n //await super.processItem(item);\r\n await LazyLoadQueueBase.prototype.processItem.call(this, item);\r\n\r\n if(this.lazyLoadMedia.length) {\r\n this.processQueue();\r\n }\r\n } */\r\n\r\n public observe(el: LazyLoadElement) {\r\n this._queue.set(el.div, el);\r\n this.intersector.observe(el.div);\r\n }\r\n}\r\n\r\nexport class LazyLoadQueueRepeat2 extends LazyLoadQueueIntersector {\r\n constructor(protected parallelLimit = PARALLEL_LIMIT, protected onVisibilityChange?: OnVisibilityChange) {\r\n super(parallelLimit);\r\n\r\n this.intersector = new VisibilityIntersector((target, visible) => {\r\n const spliced = findAndSpliceAll(this.queue, (i) => i.div === target);\r\n if(visible && spliced.length) {\r\n spliced.forEach(item => {\r\n this.queue.unshift(item);\r\n });\r\n }\r\n \r\n this.onVisibilityChange && this.onVisibilityChange(target, visible);\r\n this.setProcessQueueTimeout();\r\n });\r\n }\r\n\r\n public observe(el: HTMLElement) {\r\n this.intersector.observe(el);\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { HelpCountry, HelpCountryCode } from \"../layer\";\nimport I18n from \"../lib/langPack\";\n\nlet sortedCountries: HelpCountry[];\ntype PrefixCountry = {country: HelpCountry, code: HelpCountryCode};\nconst prefixes: Map<string, PrefixCountry> = new Map();\nlet maxPrefixLength = 0;\nconst setPrefix = (country: HelpCountry, code: HelpCountryCode, prefix: string = '') => {\n prefix = code.country_code + prefix;\n /* if(prefixes.has(prefix)) {\n console.error('asdasdasd', prefixes.get(prefix), country, code);\n } */\n maxPrefixLength = Math.max(maxPrefixLength, prefix.length);\n prefixes.set(prefix, {country, code});\n};\n\nexport function formatPhoneNumber(originalStr: string): {\n formatted: string,\n country: HelpCountry,\n code: HelpCountryCode,\n leftPattern: string\n} {\n originalStr = originalStr || '';\n \n if(!prefixes.size) {\n I18n.countriesList.forEach(country => {\n country.country_codes.forEach(code => {\n const s = {country, code};\n\n if(code.prefixes) {\n code.prefixes.forEach(prefix => {\n setPrefix(country, code, prefix);\n });\n } else {\n setPrefix(country, code);\n }\n });\n });\n }\n\n // return {formatted: originalStr, country: undefined as any, leftPattern: ''};\n let str = originalStr.replace(/\\D/g, '');\n let phoneCode = str.slice(0, maxPrefixLength);\n \n ////console.log('str', str, phoneCode);\n // if(!sortedCountries) {\n // sortedCountries = I18n.countriesList.slice().sort((a, b) => b.country_codes[0].country_code.length - a.country_codes[0].country_code.length);\n // }\n \n // let country = sortedCountries.find((c) => {\n // return c.country_codes.find((c) => phoneCode.indexOf(c.replace(/\\D/g, '')) === 0);\n // });\n\n let prefixCountry: PrefixCountry;\n for(let i = phoneCode.length - 1; i >= 0; --i) { // lookup for country by prefix\n prefixCountry = prefixes.get(phoneCode.slice(0, i + 1));\n if(prefixCountry) {\n break;\n }\n }\n\n if(!prefixCountry) {\n return {\n formatted: str, \n country: undefined, \n code: undefined, \n leftPattern: ''\n };\n }\n\n // country = /* PhoneCodesMain[country.phoneCode] || */country;\n const country = prefixCountry.country;\n \n const patterns = prefixCountry.code.patterns || [];\n const searchForPattern = str.slice(prefixCountry.code.country_code.length); // splice country code\n let pattern = '', mostMatchedPatternMatches = 0, mostMatchedPattern = '';\n for(let i = patterns.length - 1; i >= 0; --i) {\n pattern = patterns[i];\n\n const _pattern = pattern.replace(/ /g, '');\n let patternMatches = 0;\n for(let k = 0, length = Math.min(searchForPattern.length, _pattern.length); k < length; ++k) {\n if(searchForPattern[k] === _pattern[k] || _pattern[k] === 'X') {\n ++patternMatches;\n } else {\n patternMatches = 0;\n break;\n }\n }\n\n if(patternMatches > mostMatchedPatternMatches) {\n mostMatchedPatternMatches = patternMatches;\n mostMatchedPattern = pattern;\n }\n }\n\n pattern = mostMatchedPattern || pattern;\n pattern = pattern.replace(/\\d/g, 'X');\n\n pattern = prefixCountry.code.country_code + ' ' + pattern;\n // let pattern = country.pattern || country.phoneCode;\n pattern.split('').forEach((symbol, idx) => {\n if(symbol === ' ' && str[idx] !== ' ' && str.length > idx) {\n str = str.slice(0, idx) + ' ' + str.slice(idx);\n }\n });\n \n /* if(country.pattern) {\n str = str.slice(0, country.pattern.length);\n } */\n\n let leftPattern = pattern && pattern.length > str.length ? pattern.slice(str.length) : '';\n if(leftPattern) {\n /* const length = str.length;\n leftPattern = leftPattern.split('').map((_, idx) => (length + idx).toString().slice(-1)).join(''); */\n leftPattern = leftPattern.replace(/X/g, '');\n // leftPattern = leftPattern.replace(/X/g, '0');\n }\n \n return {formatted: str, country, code: prefixCountry.code, leftPattern};\n}\n","export default function assumeType<T>(x: unknown): asserts x is T {\r\n return; // ¯\\_(ツ)_/¯\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function htmlToSpan(html: string) {\r\n const span = document.createElement('span');\r\n span.innerHTML = html;\r\n return span;\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov <igor.beatle@gmail.com>\n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport { bufferConcats } from '../../helpers/bytes';\nimport { add_, bigInt2str, cmp, leftShift_, str2bigInt } from '../../vendor/leemon';\n\n \n \n \n\n \n \n \n \n \n \n \n \n \n\nexport function isObject(object: any) {\n return typeof(object) === 'object' && object !== null;\n}\n\n/* export function bigint(num: number) {\n return new BigInteger(num.toString(16), 16);\n} */\n\n/* export function bigStringInt(strNum: string) {\n return new BigInteger(strNum, 10);\n} */\n\n/* export function base64ToBlob(base64str: string, mimeType: string) {\n var sliceSize = 1024;\n var byteCharacters = atob(base64str);\n var bytesLength = byteCharacters.length;\n var slicesCount = Math.ceil(bytesLength / sliceSize);\n var byteArrays = new Array(slicesCount);\n\n for(var sliceIndex = 0; sliceIndex < slicesCount; ++sliceIndex) {\n var begin = sliceIndex * sliceSize;\n var end = Math.min(begin + sliceSize, bytesLength);\n\n var bytes = new Array(end - begin);\n for(var offset = begin, i = 0; offset < end; ++i, ++offset) {\n bytes[i] = byteCharacters[offset].charCodeAt(0);\n }\n byteArrays[sliceIndex] = new Uint8Array(bytes);\n }\n\n return blobConstruct(byteArrays, mimeType);\n}\n\nexport function dataUrlToBlob(url: string) {\n // var name = 'b64blob ' + url.length\n // console.time(name)\n var urlParts = url.split(',');\n var base64str = urlParts[1];\n var mimeType = urlParts[0].split(':')[1].split(';')[0];\n var blob = base64ToBlob(base64str, mimeType);\n // console.timeEnd(name)\n return blob;\n} */\n\nexport function intToUint(val: number) {\n // return val < 0 ? val + 4294967296 : val; // 0 <= val <= Infinity\n return val >>> 0; // (4294967296 >>> 0) === 0; 0 <= val <= 4294967295\n}\n\n/* export function bytesFromBigInt(bigInt: BigInteger, len?: number) {\n var bytes = bigInt.toByteArray();\n\n if(len && bytes.length < len) {\n var padding = [];\n for(var i = 0, needPadding = len - bytes.length; i < needPadding; i++) {\n padding[i] = 0;\n }\n if(bytes instanceof ArrayBuffer) {\n bytes = bufferConcat(padding, bytes);\n } else {\n bytes = padding.concat(bytes);\n }\n } else {\n while (!bytes[0] && (!len || bytes.length > len)) {\n bytes = bytes.slice(1);\n }\n }\n\n return bytes;\n} */\n\nexport function longFromInts(high: number, low: number): string {\n //let perf = performance.now();\n //let str = bigint(high).shiftLeft(32).add(bigint(low)).toString(10);\n //console.log('longFromInts jsbn', performance.now() - perf);\n high = intToUint(high);\n low = intToUint(low);\n \n //perf = performance.now();\n const bigInt = str2bigInt(high.toString(16), 16, 32);//int2bigInt(high, 64, 64);\n //console.log('longFromInts construct high', bigint(high).toString(10), bigInt2str(bigInt, 10));\n leftShift_(bigInt, 32);\n //console.log('longFromInts shiftLeft', bigint(high).shiftLeft(32).toString(10), bigInt2str(bigInt, 10));\n add_(bigInt, str2bigInt(low.toString(16), 16, 32));\n const _str = bigInt2str(bigInt, 10);\n\n //console.log('longFromInts leemon', performance.now() - perf);\n\n //console.log('longFromInts', high, low, str, _str, str === _str);\n\n return _str;\n}\n\nexport function sortLongsArray(arr: string[]) {\n return arr.map(long => {\n return str2bigInt(long, 10);\n }).sort((a, b) => {\n return cmp(a, b);\n }).map(bigInt => {\n return bigInt2str(bigInt, 10);\n });\n}\n\nexport function addPadding<T extends number[] | ArrayBuffer | Uint8Array>(\n bytes: T, \n blockSize: number = 16, \n zeroes?: boolean, \n blockSizeAsTotalLength = false, \n prepend = false\n): T {\n const len = (bytes as ArrayBuffer).byteLength || (bytes as Uint8Array).length;\n const needPadding = blockSizeAsTotalLength ? blockSize - len : blockSize - (len % blockSize);\n if(needPadding > 0 && needPadding < blockSize) {\n ////console.log('addPadding()', len, blockSize, needPadding);\n const padding = new Uint8Array(needPadding);\n if(zeroes) {\n for(let i = 0; i < needPadding; ++i) {\n padding[i] = 0;\n }\n } else {\n padding.randomize();\n }\n\n if(bytes instanceof ArrayBuffer) {\n return (prepend ? bufferConcats(padding, bytes) : bufferConcats(bytes, padding)).buffer as T;\n } else if(bytes instanceof Uint8Array) {\n return (prepend ? bufferConcats(padding, bytes) : bufferConcats(bytes, padding)) as T;\n } else {\n // @ts-ignore\n return (prepend ? [...padding].concat(bytes) : bytes.concat([...padding])) as T;\n }\n }\n\n return bytes;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport class WindowSize {\n public width = 0;\n public height = 0;\n\n constructor() {\n // @ts-ignore\n const w: any = 'visualViewport' in window ? window.visualViewport : window;\n const set = () => {\n this.width = w.width || w.innerWidth;\n this.height = w.height || w.innerHeight;\n };\n w.addEventListener('resize', set);\n set();\n }\n}\n\nconst windowSize = new WindowSize();\nexport default windowSize;\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\r\n\r\nexport class AppMessagesIdsManager {\r\n private static MESSAGE_ID_INCREMENT = 0x10000;\r\n private static MESSAGE_ID_OFFSET = 0xFFFFFFFF;\r\n\r\n private tempNum = 0;\r\n\r\n public generateMessageId(messageId: number, temp = false) {\r\n const q = AppMessagesIdsManager.MESSAGE_ID_OFFSET;\r\n const num = temp ? ++this.tempNum : 0;\r\n if(messageId >= q) {\r\n if(temp) {\r\n return messageId + (num & (AppMessagesIdsManager.MESSAGE_ID_INCREMENT - 1));\r\n }\r\n\r\n return messageId;\r\n }\r\n\r\n return q + (messageId * AppMessagesIdsManager.MESSAGE_ID_INCREMENT + (num & (AppMessagesIdsManager.MESSAGE_ID_INCREMENT - 1)));\r\n }\r\n\r\n /**\r\n * * will ignore outgoing offset\r\n */\r\n public getServerMessageId(messageId: number) {\r\n return this.clearMessageId(messageId, true);\r\n }\r\n\r\n public clearMessageId(messageId: number, toServer?: boolean) {\r\n const q = AppMessagesIdsManager.MESSAGE_ID_OFFSET;\r\n if(messageId < q) { // id 0 -> mid 0xFFFFFFFF, so 0xFFFFFFFF must convert to 0\r\n return messageId;\r\n }\r\n\r\n const l = AppMessagesIdsManager.MESSAGE_ID_INCREMENT - 1;\r\n const used = messageId & l;\r\n if(used !== l) {\r\n messageId -= used + 1;\r\n }\r\n\r\n return toServer ? (messageId - q) / AppMessagesIdsManager.MESSAGE_ID_INCREMENT : messageId;\r\n }\r\n\r\n public incrementMessageId(messageId: number, increment: number) {\r\n return this.generateMessageId(this.getServerMessageId(messageId) + increment);\r\n }\r\n}\r\n\r\nconst appMessagesIdsManager = new AppMessagesIdsManager();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.appMessagesIdsManager = appMessagesIdsManager);\r\nexport default appMessagesIdsManager;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov <igor.beatle@gmail.com>\r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport { fontFamily } from \"../../components/middleEllipsis\";\r\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\r\nimport { CancellablePromise, deferredPromise } from \"../../helpers/cancellablePromise\";\r\nimport { tsNow } from \"../../helpers/date\";\r\nimport { deepEqual } from \"../../helpers/object\";\r\nimport { convertInputKeyToKey } from \"../../helpers/string\";\r\nimport { IS_MOBILE } from \"../../environment/userAgent\";\r\nimport { InputNotifyPeer, InputPeerNotifySettings, NotifyPeer, PeerNotifySettings, Update } from \"../../layer\";\r\nimport I18n from \"../langPack\";\r\nimport apiManager from \"../mtproto/mtprotoworker\";\r\nimport webPushApiManager, { PushSubscriptionNotify } from \"../mtproto/webPushApiManager\";\r\nimport rootScope from \"../rootScope\";\r\nimport stateStorage from \"../stateStorage\";\r\nimport apiUpdatesManager from \"./apiUpdatesManager\";\r\nimport appChatsManager from \"./appChatsManager\";\r\nimport appPeersManager from \"./appPeersManager\";\r\nimport appRuntimeManager from \"./appRuntimeManager\";\r\nimport appStateManager from \"./appStateManager\";\r\nimport appUsersManager from \"./appUsersManager\";\r\nimport IS_VIBRATE_SUPPORTED from \"../../environment/vibrateSupport\";\r\n\r\ntype MyNotification = Notification & {\r\n hidden?: boolean,\r\n show?: () => void,\r\n};\r\n\r\nexport type NotifyOptions = Partial<{\r\n tag: string;\r\n image: string;\r\n key: string;\r\n title: string;\r\n message: string;\r\n silent: boolean;\r\n onclick: () => void;\r\n}>;\r\n\r\nexport type NotificationSettings = {\r\n nodesktop: boolean,\r\n volume: number,\r\n novibrate: boolean,\r\n nopreview: boolean,\r\n nopush: boolean,\r\n nosound: boolean\r\n};\r\n\r\ntype ImSadAboutIt = Promise<PeerNotifySettings> | PeerNotifySettings;\r\nexport class AppNotificationsManager {\r\n private notificationsUiSupport: boolean;\r\n private notificationsShown: {[key: string]: MyNotification | true} = {};\r\n private notificationIndex = 0;\r\n private notificationsCount = 0;\r\n private soundsPlayed: {[tag: string]: number} = {};\r\n private vibrateSupport = IS_VIBRATE_SUPPORTED;\r\n private nextSoundAt: number;\r\n private prevSoundVolume: number;\r\n private peerSettings = {\r\n notifyPeer: {} as {[peerId: PeerId]: ImSadAboutIt},\r\n notifyUsers: null as ImSadAboutIt,\r\n notifyChats: null as ImSadAboutIt,\r\n notifyBroadcasts: null as ImSadAboutIt\r\n };\r\n //private exceptions: {[peerId: string]: PeerNotifySettings} = {};\r\n private notifyContactsSignUp: Promise<boolean>;\r\n private faviconEl: HTMLLinkElement = document.head.querySelector('link[rel=\"icon\"]');\r\n\r\n private titleBackup = document.title;\r\n private titleChanged = false;\r\n private titleInterval: number;\r\n private prevFavicon: string;\r\n private stopped = false;\r\n\r\n private settings: NotificationSettings = {} as any;\r\n\r\n private registeredDevice: any;\r\n private pushInited = false;\r\n\r\n private topMessagesDeferred: CancellablePromise<void>;\r\n\r\n private notifySoundEl: HTMLElement;\r\n\r\n private getNotifyPeerTypePromise: Promise<any>;\r\n\r\n constructor() {\r\n // @ts-ignore\r\n navigator.vibrate = navigator.vibrate || navigator.mozVibrate || navigator.webkitVibrate;\r\n\r\n this.notificationsUiSupport = ('Notification' in window) || ('mozNotification' in navigator);\r\n\r\n this.topMessagesDeferred = deferredPromise<void>();\r\n\r\n this.notifySoundEl = document.createElement('div');\r\n this.notifySoundEl.id = 'notify-sound';\r\n document.body.append(this.notifySoundEl);\r\n\r\n rootScope.addEventListener('instance_deactivated', () => {\r\n this.stop();\r\n });\r\n\r\n rootScope.addEventListener('instance_activated', () => {\r\n if(this.stopped) {\r\n this.start();\r\n }\r\n });\r\n\r\n rootScope.addEventListener('idle', (newVal) => {\r\n if(this.stopped) {\r\n return;\r\n }\r\n\r\n if(!newVal) {\r\n this.clear();\r\n }\r\n\r\n this.toggleToggler();\r\n });\r\n\r\n rootScope.addMultipleEventsListeners({\r\n updateNotifySettings: (update) => {\r\n const peerId = update.peer._ === 'notifyPeer' && appPeersManager.getPeerId(update.peer.peer);\r\n const key = update.peer._ !== 'notifyPeer' ? update.peer._ : undefined;\r\n this.savePeerSettings({\r\n key,\r\n peerId, \r\n settings: update.notify_settings\r\n });\r\n rootScope.dispatchEvent('notify_settings', update);\r\n }\r\n });\r\n\r\n rootScope.addEventListener('push_init', (tokenData) => {\r\n this.pushInited = true;\r\n if(!this.settings.nodesktop && !this.settings.nopush) {\r\n if(tokenData) {\r\n this.registerDevice(tokenData);\r\n } else {\r\n webPushApiManager.subscribe();\r\n }\r\n } else {\r\n this.unregisterDevice(tokenData);\r\n }\r\n });\r\n rootScope.addEventListener('push_subscribe', (tokenData) => {\r\n this.registerDevice(tokenData);\r\n });\r\n rootScope.addEventListener('push_unsubscribe', (tokenData) => {\r\n this.unregisterDevice(tokenData);\r\n });\r\n\r\n rootScope.addEventListener('dialogs_multiupdate', () => {\r\n //unregisterTopMsgs()\r\n this.topMessagesDeferred.resolve();\r\n }, {once: true});\r\n\r\n rootScope.addEventListener('push_notification_click', (notificationData) => {\r\n if(notificationData.action === 'push_settings') {\r\n /* this.topMessagesDeferred.then(() => {\r\n $modal.open({\r\n templateUrl: templateUrl('settings_modal'),\r\n controller: 'SettingsModalController',\r\n windowClass: 'settings_modal_window mobile_modal',\r\n backdrop: 'single'\r\n })\r\n }); */\r\n return;\r\n }\r\n\r\n if(notificationData.action === 'mute1d') {\r\n apiManager.invokeApi('account.updateDeviceLocked', {\r\n period: 86400\r\n }).then(() => {\r\n // var toastData = toaster.pop({\r\n // type: 'info',\r\n // body: _('push_action_mute1d_success'),\r\n // bodyOutputType: 'trustedHtml',\r\n // clickHandler: () => {\r\n // toaster.clear(toastData)\r\n // },\r\n // showCloseButton: false\r\n // })\r\n });\r\n\r\n return;\r\n }\r\n\r\n const peerId = notificationData.custom && notificationData.custom.peerId.toPeerId();\r\n console.log('click', notificationData, peerId);\r\n if(peerId) {\r\n this.topMessagesDeferred.then(() => {\r\n if(notificationData.custom.channel_id &&\r\n !appChatsManager.hasChat(notificationData.custom.channel_id)) {\r\n return;\r\n }\r\n\r\n if(peerId.isUser() && !appUsersManager.hasUser(peerId)) {\r\n return;\r\n }\r\n\r\n rootScope.dispatchEvent('history_focus', {\r\n peerId,\r\n mid: +notificationData.custom.msg_id\r\n });\r\n });\r\n }\r\n });\r\n }\r\n\r\n private toggleToggler(enable = rootScope.idle.isIDLE) {\r\n if(IS_MOBILE) return;\r\n\r\n const resetTitle = () => {\r\n this.titleChanged = false;\r\n document.title = this.titleBackup;\r\n this.setFavicon();\r\n };\r\n\r\n window.clearInterval(this.titleInterval);\r\n this.titleInterval = 0;\r\n\r\n if(!enable) {\r\n resetTitle();\r\n } else {\r\n this.titleInterval = window.setInterval(() => {\r\n const count = this.notificationsCount;\r\n if(!count) {\r\n this.toggleToggler(false);\r\n } else if(this.titleChanged) {\r\n resetTitle();\r\n } else {\r\n this.titleChanged = true;\r\n document.title = I18n.format('Notifications.Count', true, [count]);\r\n //this.setFavicon('assets/img/favicon_unread.ico');\r\n\r\n // fetch('assets/img/favicon.ico')\r\n // .then(res => res.blob())\r\n // .then(blob => {\r\n // const img = document.createElement('img');\r\n // img.src = URL.createObjectURL(blob);\r\n\r\n const canvas = document.createElement('canvas');\r\n canvas.width = 32 * window.devicePixelRatio;\r\n canvas.height = canvas.width;\r\n \r\n const ctx = canvas.getContext('2d');\r\n ctx.beginPath();\r\n ctx.arc(canvas.width / 2, canvas.height / 2, canvas.width / 2, 0, 2 * Math.PI, false);\r\n ctx.fillStyle = '#3390ec';\r\n ctx.fill();\r\n\r\n let fontSize = 24;\r\n let str = '' + count;\r\n if(count < 10) {\r\n fontSize = 22;\r\n } else if(count < 100) {\r\n fontSize = 20;\r\n } else {\r\n str = '99+';\r\n fontSize = 16;\r\n }\r\n\r\n fontSize *= window.devicePixelRatio;\r\n \r\n ctx.font = `700 ${fontSize}px ${fontFamily}`;\r\n ctx.textBaseline = 'middle';\r\n ctx.textAlign = 'center';\r\n ctx.fillStyle = 'white';\r\n ctx.fillText(str, canvas.width / 2, canvas.height * .5625);\r\n\r\n /* const ctx = canvas.getContext('2d');\r\n ctx.drawImage(img, 0, 0, canvas.width, canvas.height); */\r\n \r\n this.setFavicon(canvas.toDataURL());\r\n // });\r\n }\r\n }, 1000);\r\n }\r\n }\r\n\r\n public updateLocalSettings = () => {\r\n Promise.all(['notify_nodesktop', 'notify_volume', 'notify_novibrate', 'notify_nopreview', 'notify_nopush'].map(k => stateStorage.get(k as any)))\r\n .then((updSettings) => {\r\n this.settings.nodesktop = updSettings[0];\r\n this.settings.volume = updSettings[1] === undefined ? 0.5 : updSettings[1];\r\n this.settings.novibrate = updSettings[2];\r\n this.settings.nopreview = updSettings[3];\r\n this.settings.nopush = updSettings[4];\r\n\r\n if(this.pushInited) {\r\n const needPush = !this.settings.nopush && !this.settings.nodesktop && webPushApiManager.isAvailable || false;\r\n const hasPush = this.registeredDevice !== false;\r\n if(needPush !== hasPush) {\r\n if(needPush) {\r\n webPushApiManager.subscribe();\r\n } else {\r\n webPushApiManager.unsubscribe();\r\n }\r\n }\r\n }\r\n\r\n webPushApiManager.setSettings(this.settings);\r\n });\r\n\r\n appStateManager.getState().then(state => {\r\n this.settings.nosound = !state.settings.notifications.sound;\r\n });\r\n }\r\n\r\n public getLocalSettings() {\r\n return this.settings;\r\n }\r\n\r\n public getNotifySettings(peer: InputNotifyPeer): ImSadAboutIt {\r\n let key: any = convertInputKeyToKey(peer._);\r\n let obj: any = this.peerSettings[key as NotifyPeer['_']];\r\n\r\n let peerId: PeerId;\r\n if(peer._ === 'inputNotifyPeer') {\r\n peerId = key = appPeersManager.getPeerId(peer.peer);\r\n obj = obj[key];\r\n }\r\n\r\n if(obj) {\r\n return obj;\r\n }\r\n\r\n return (obj || this.peerSettings)[key] = apiManager.invokeApi('account.getNotifySettings', {peer})\r\n .then(settings => {\r\n this.savePeerSettings({\r\n key,\r\n peerId, \r\n settings\r\n });\r\n \r\n return settings;\r\n });\r\n }\r\n\r\n public getNotifyPeerTypeSettings() {\r\n if(this.getNotifyPeerTypePromise) return this.getNotifyPeerTypePromise;\r\n\r\n const promises = (['inputNotifyBroadcasts', 'inputNotifyUsers', 'inputNotifyChats'] as Exclude<InputNotifyPeer['_'], 'inputNotifyPeer'>[])\r\n .map((inputKey) => {\r\n return this.getNotifySettings({_: inputKey});\r\n });\r\n\r\n return this.getNotifyPeerTypePromise = Promise.all(promises);\r\n }\r\n\r\n public updateNotifySettings(peer: InputNotifyPeer, settings: InputPeerNotifySettings) {\r\n //this.savePeerSettings(peerId, settings);\r\n\r\n /* const inputSettings: InputPeerNotifySettings = copy(settings) as any;\r\n inputSettings._ = 'inputPeerNotifySettings'; */\r\n\r\n return apiManager.invokeApi('account.updateNotifySettings', {\r\n peer,\r\n settings\r\n }).then(value => {\r\n if(value) {\r\n apiUpdatesManager.processLocalUpdate({\r\n _: 'updateNotifySettings', \r\n peer: {\r\n ...peer as any,\r\n _: convertInputKeyToKey(peer._)\r\n }, \r\n notify_settings: { // ! WOW, IT WORKS !\r\n ...settings,\r\n _: 'peerNotifySettings',\r\n }\r\n });\r\n }\r\n });\r\n }\r\n\r\n public getNotifyExceptions() {\r\n apiManager.invokeApi('account.getNotifyExceptions', {compare_sound: true})\r\n .then((updates) => {\r\n apiUpdatesManager.processUpdateMessage(updates);\r\n });\r\n }\r\n\r\n public getContactSignUpNotification() {\r\n if(this.notifyContactsSignUp) return this.notifyContactsSignUp;\r\n return this.notifyContactsSignUp = apiManager.invokeApi('account.getContactSignUpNotification');\r\n }\r\n\r\n public setContactSignUpNotification(silent: boolean) {\r\n apiManager.invokeApi('account.setContactSignUpNotification', {silent})\r\n .then(value => {\r\n this.notifyContactsSignUp = Promise.resolve(!silent);\r\n });\r\n }\r\n\r\n private setFavicon(href: string = 'assets/img/favicon.ico') {\r\n if(this.prevFavicon === href) {\r\n return;\r\n }\r\n\r\n const link = this.faviconEl.cloneNode() as HTMLLinkElement;\r\n link.href = href;\r\n this.faviconEl.parentNode.replaceChild(link, this.faviconEl);\r\n this.faviconEl = link;\r\n\r\n this.prevFavicon = href;\r\n }\r\n\r\n public savePeerSettings({key, peerId, settings}: {\r\n key?: Exclude<NotifyPeer['_'], 'notifyPeer'>,\r\n peerId?: PeerId, \r\n settings: PeerNotifySettings\r\n }) {\r\n let obj: any;\r\n if(peerId) {\r\n key = peerId as any;\r\n obj = this.peerSettings['notifyPeer'];\r\n }\r\n \r\n (obj || this.peerSettings)[key] = settings;\r\n\r\n if(!peerId) {\r\n rootScope.dispatchEvent('notify_peer_type_settings', {key, settings});\r\n }\r\n\r\n //rootScope.broadcast('notify_settings', {peerId: peerId});\r\n }\r\n\r\n public isMuted(peerNotifySettings: PeerNotifySettings) {\r\n return peerNotifySettings._ === 'peerNotifySettings' &&\r\n ((peerNotifySettings.mute_until * 1000) > tsNow() || peerNotifySettings.silent);\r\n }\r\n\r\n public getPeerMuted(peerId: PeerId) {\r\n const ret = this.getNotifySettings({_: 'inputNotifyPeer', peer: appPeersManager.getInputPeerById(peerId)});\r\n return (ret instanceof Promise ? ret : Promise.resolve(ret))\r\n .then((peerNotifySettings) => this.isMuted(peerNotifySettings));\r\n }\r\n\r\n public getPeerLocalSettings(peerId: PeerId, respectType = true): PeerNotifySettings {\r\n const n: PeerNotifySettings = {\r\n _: 'peerNotifySettings'\r\n };\r\n\r\n const notifySettings = this.peerSettings['notifyPeer'][peerId];\r\n //if(!notifySettings || (notifySettings instanceof Promise)) return false;\r\n if(notifySettings && !(notifySettings instanceof Promise)) {\r\n Object.assign(n, notifySettings);\r\n }\r\n\r\n if(respectType) {\r\n const inputNotify = appPeersManager.getInputNotifyPeerById(peerId, true);\r\n const key = convertInputKeyToKey(inputNotify._);\r\n const typeNotifySettings = this.peerSettings[key as NotifyPeer['_']];\r\n if(typeNotifySettings && !(typeNotifySettings instanceof Promise)) {\r\n for(let i in typeNotifySettings) {\r\n // @ts-ignore\r\n if(n[i] === undefined) {\r\n // @ts-ignore\r\n n[i] = typeNotifySettings[i];\r\n }\r\n }\r\n }\r\n }\r\n\r\n return n;\r\n }\r\n\r\n public isPeerLocalMuted(peerId: PeerId, respectType = true) {\r\n if(peerId === rootScope.myId) return false;\r\n\r\n const notifySettings = this.getPeerLocalSettings(peerId, respectType);\r\n return this.isMuted(notifySettings);\r\n }\r\n\r\n public start() {\r\n this.updateLocalSettings();\r\n rootScope.addEventListener('settings_updated', this.updateLocalSettings);\r\n webPushApiManager.start();\r\n\r\n if(!this.notificationsUiSupport) {\r\n return false;\r\n }\r\n\r\n if('Notification' in window && Notification.permission !== 'granted' && Notification.permission !== 'denied') {\r\n window.addEventListener('click', this.requestPermission);\r\n }\r\n\r\n try {\r\n if('onbeforeunload' in window) {\r\n window.addEventListener('beforeunload', this.clear);\r\n }\r\n } catch (e) {}\r\n }\r\n\r\n private stop() {\r\n this.clear();\r\n window.clearInterval(this.titleInterval);\r\n this.titleInterval = 0;\r\n this.setFavicon();\r\n this.stopped = true;\r\n }\r\n\r\n private requestPermission = () => {\r\n Notification.requestPermission();\r\n window.removeEventListener('click', this.requestPermission);\r\n };\r\n\r\n public notify(data: NotifyOptions) {\r\n //console.log('notify', data, rootScope.idle.isIDLE, this.notificationsUiSupport, this.stopped);\r\n \r\n if(this.stopped) {\r\n return;\r\n }\r\n\r\n // FFOS Notification blob src bug workaround\r\n /* if(Config.Navigator.ffos && !Config.Navigator.ffos2p) {\r\n data.image = 'https://telegram.org/img/t_logo.png'\r\n }\r\n else if (data.image && !angular.isString(data.image)) {\r\n if (Config.Navigator.ffos2p) {\r\n FileManager.getDataUrl(data.image, 'image/jpeg').then(function (url) {\r\n data.image = url\r\n notify(data)\r\n })\r\n return false\r\n } else {\r\n data.image = FileManager.getUrl(data.image, 'image/jpeg')\r\n }\r\n }\r\n else */ if(!data.image) {\r\n data.image = 'assets/img/logo_filled_rounded.png';\r\n }\r\n // console.log('notify image', data.image)\r\n\r\n this.notificationsCount++;\r\n if(!this.titleInterval) {\r\n this.toggleToggler();\r\n }\r\n\r\n const idx = ++this.notificationIndex;\r\n const key = data.key || 'k' + idx;\r\n this.notificationsShown[key] = true;\r\n\r\n const now = tsNow();\r\n if(this.settings.volume > 0 && !this.settings.nosound/* &&\r\n (\r\n !data.tag ||\r\n !this.soundsPlayed[data.tag] ||\r\n now > this.soundsPlayed[data.tag] + 60000\r\n ) */\r\n ) {\r\n this.testSound(this.settings.volume);\r\n this.soundsPlayed[data.tag] = now;\r\n }\r\n\r\n if(!this.notificationsUiSupport ||\r\n 'Notification' in window && Notification.permission !== 'granted') {\r\n return false;\r\n }\r\n\r\n if(this.settings.nodesktop) {\r\n if(this.vibrateSupport && !this.settings.novibrate) {\r\n navigator.vibrate([200, 100, 200]);\r\n return;\r\n }\r\n\r\n return;\r\n }\r\n\r\n let notification: MyNotification;\r\n\r\n if('Notification' in window) {\r\n try {\r\n if(data.tag) {\r\n for(let i in this.notificationsShown) {\r\n const notification = this.notificationsShown[i];\r\n if(typeof(notification) !== 'boolean' && notification.tag === data.tag) {\r\n notification.hidden = true;\r\n }\r\n }\r\n }\r\n\r\n notification = new Notification(data.title, {\r\n icon: data.image || '',\r\n body: data.message || '',\r\n tag: data.tag || '',\r\n silent: data.silent || false\r\n });\r\n\r\n //console.log('notify constructed notification');\r\n } catch(e) {\r\n this.notificationsUiSupport = false;\r\n webPushApiManager.setLocalNotificationsDisabled();\r\n return;\r\n }\r\n } /* else if('mozNotification' in navigator) {\r\n notification = navigator.mozNotification.createNotification(data.title, data.message || '', data.image || '')\r\n } else if(notificationsMsSiteMode) {\r\n window.external.msSiteModeClearIconOverlay()\r\n window.external.msSiteModeSetIconOverlay('img/icons/icon16.png', data.title)\r\n window.external.msSiteModeActivate()\r\n notification = {\r\n index: idx\r\n }\r\n } */ else {\r\n return;\r\n }\r\n\r\n notification.onclick = () => {\r\n notification.close();\r\n appRuntimeManager.focus();\r\n this.clear();\r\n if(data.onclick) {\r\n data.onclick();\r\n }\r\n };\r\n\r\n notification.onclose = () => {\r\n if(!notification.hidden) {\r\n delete this.notificationsShown[key];\r\n this.clear();\r\n }\r\n };\r\n\r\n if(notification.show) {\r\n notification.show();\r\n }\r\n this.notificationsShown[key] = notification;\r\n\r\n if(!IS_MOBILE) {\r\n setTimeout(() => {\r\n this.hide(key);\r\n }, 8000);\r\n }\r\n }\r\n\r\n public testSound(volume: number) {\r\n const now = tsNow();\r\n if(this.nextSoundAt && now < this.nextSoundAt && this.prevSoundVolume === volume) {\r\n return;\r\n }\r\n\r\n this.nextSoundAt = now + 1000;\r\n this.prevSoundVolume = volume;\r\n const filename = 'assets/audio/notification.mp3';\r\n const audio = document.createElement('audio');\r\n audio.autoplay = true;\r\n audio.setAttribute('mozaudiochannel', 'notification');\r\n audio.volume = volume;\r\n audio.innerHTML = `\r\n <source src=\"${filename}\" type=\"audio/mpeg\" />\r\n <embed hidden=\"true\" autostart=\"true\" loop=\"false\" volume=\"${volume * 100}\" src=\"${filename}\" />\r\n `;\r\n this.notifySoundEl.append(audio);\r\n\r\n audio.addEventListener('ended', () => {\r\n audio.remove();\r\n }, {once: true});\r\n }\r\n\r\n public cancel(key: string) {\r\n const notification = this.notificationsShown[key];\r\n if(notification) {\r\n if(this.notificationsCount > 0) {\r\n --this.notificationsCount;\r\n }\r\n\r\n try {\r\n if(typeof(notification) !== 'boolean' && notification.close) {\r\n notification.hidden = true;\r\n notification.close();\r\n }/* else if(notificationsMsSiteMode &&\r\n notification.index === notificationIndex) {\r\n window.external.msSiteModeClearIconOverlay()\r\n } */\r\n } catch(e) {}\r\n\r\n delete this.notificationsShown[key];\r\n }\r\n }\r\n\r\n private hide(key: string) {\r\n const notification = this.notificationsShown[key];\r\n if(notification && typeof(notification) !== 'boolean') {\r\n try {\r\n if(notification.close) {\r\n notification.hidden = true;\r\n notification.close();\r\n }\r\n } catch(e) {}\r\n }\r\n }\r\n\r\n public soundReset(tag: string) {\r\n delete this.soundsPlayed[tag];\r\n }\r\n\r\n public clear() {\r\n /* if(notificationsMsSiteMode) {\r\n window.external.msSiteModeClearIconOverlay()\r\n } else { */\r\n for(const i in this.notificationsShown) {\r\n const notification = this.notificationsShown[i];\r\n try {\r\n if(typeof(notification) !== 'boolean' && notification.close) {\r\n notification.close();\r\n }\r\n } catch(e) {}\r\n }\r\n /* } */\r\n this.notificationsShown = {};\r\n this.notificationsCount = 0;\r\n\r\n webPushApiManager.hidePushNotifications();\r\n }\r\n\r\n private registerDevice(tokenData: PushSubscriptionNotify) {\r\n if(this.registeredDevice && deepEqual(this.registeredDevice, tokenData)) {\r\n return false;\r\n }\r\n\r\n apiManager.invokeApi('account.registerDevice', {\r\n token_type: tokenData.tokenType,\r\n token: tokenData.tokenValue,\r\n other_uids: [],\r\n app_sandbox: false,\r\n secret: new Uint8Array()\r\n }).then(() => {\r\n this.registeredDevice = tokenData;\r\n }, (error) => {\r\n error.handled = true;\r\n });\r\n }\r\n\r\n private unregisterDevice(tokenData: PushSubscriptionNotify) {\r\n if(!this.registeredDevice) {\r\n return false;\r\n }\r\n\r\n apiManager.invokeApi('account.unregisterDevice', {\r\n token_type: tokenData.tokenType,\r\n token: tokenData.tokenValue,\r\n other_uids: []\r\n }).then(() => {\r\n this.registeredDevice = false;\r\n }, (error) => {\r\n error.handled = true;\r\n });\r\n }\r\n\r\n public getVibrateSupport() {\r\n return this.vibrateSupport\r\n }\r\n}\r\n\r\nconst appNotificationsManager = new AppNotificationsManager();\r\nMOUNT_CLASS_TO.appNotificationsManager = appNotificationsManager;\r\nexport default appNotificationsManager;\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\n// import { getHeavyAnimationPromise } from \"../../hooks/useHeavyAnimationCheck\";\n\nexport const loadedURLs: {[url: string]: boolean} = {};\nconst set = (elem: HTMLElement | HTMLImageElement | SVGImageElement | HTMLVideoElement, url: string) => {\n if(elem instanceof HTMLImageElement || elem instanceof HTMLVideoElement) elem.src = url;\n else if(elem instanceof SVGImageElement) elem.setAttributeNS(null, 'href', url);\n else elem.style.backgroundImage = 'url(' + url + ')';\n};\n\n// проблема функции в том, что она не подходит для ссылок, пригодна только для blob'ов, потому что обычным ссылкам нужен 'load' каждый раз.\nexport default function renderImageFromUrl(\n elem: HTMLElement | HTMLImageElement | SVGImageElement | HTMLVideoElement, \n url: string, \n callback?: (err?: Event) => void, \n useCache = true\n) {\n if(!url) {\n console.error('renderImageFromUrl: no url?', elem, url);\n callback && callback();\n return;\n }\n\n if(((loadedURLs[url]/* && false */) && useCache) || elem instanceof HTMLVideoElement) {\n if(elem) {\n set(elem, url);\n }\n \n callback && callback();\n // callback && getHeavyAnimationPromise().then(() => callback());\n } else {\n const isImage = elem instanceof HTMLImageElement;\n const loader = isImage ? elem as HTMLImageElement : new Image();\n //const loader = new Image();\n loader.src = url;\n //let perf = performance.now();\n loader.addEventListener('load', () => {\n if(!isImage && elem) {\n set(elem, url);\n }\n\n loadedURLs[url] = true;\n //console.log('onload:', url, performance.now() - perf);\n // TODO: переделать прогрузки аватаров до начала анимации, иначе с этим ожиданием они неприятно появляются\n // callback && getHeavyAnimationPromise().then(() => callback());\n callback && callback();\n }, {once: true});\n\n if(callback) {\n loader.addEventListener('error', callback);\n }\n }\n}\n\nexport function renderImageFromUrlPromise(elem: Parameters<typeof renderImageFromUrl>[0], url: string, useCache?: boolean) {\n return new Promise((resolve) => {\n renderImageFromUrl(elem, url, resolve, useCache);\n });\n}\n","export default function fixBase64String(str: string, toUrl: boolean) {\n if(toUrl) {\n return str.replace(/\\+/g, '-').replace(/\\//g, '_').replace(/\\=+$/, '');\n } else {\n return str.replace(/-/g, '+').replace(/_/g, '/');\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { CancellablePromise } from \"../helpers/cancellablePromise\";\r\nimport SetTransition from \"./singleTransition\";\r\nimport { fastRaf } from \"../helpers/schedulers\";\r\nimport { safeAssign } from \"../helpers/object\";\r\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\r\nimport { attachClickEvent } from \"../helpers/dom/clickEvent\";\r\nimport isInDOM from \"../helpers/dom/isInDOM\";\r\n\r\nconst TRANSITION_TIME = 200;\r\n\r\nexport default class ProgressivePreloader {\r\n public preloader: HTMLDivElement;\r\n public circle: SVGCircleElement;\r\n private cancelSvg: SVGSVGElement;\r\n private downloadSvg: HTMLElement;\r\n \r\n private tempId = 0;\r\n public detached = true;\r\n\r\n public promise: CancellablePromise<any> = null;\r\n\r\n public isUpload = false;\r\n private cancelable = true;\r\n private streamable = false;\r\n private tryAgainOnFail = true;\r\n private attachMethod: 'append' | 'prepend' = 'append';\r\n\r\n public loadFunc: (e?: Event) => {download: CancellablePromise<any>};\r\n\r\n public totalLength: number;\r\n\r\n constructor(options?: Partial<{\r\n isUpload: ProgressivePreloader['isUpload'],\r\n cancelable: ProgressivePreloader['cancelable'], \r\n streamable: ProgressivePreloader['streamable'], \r\n tryAgainOnFail: ProgressivePreloader['tryAgainOnFail'],\r\n attachMethod: ProgressivePreloader['attachMethod']\r\n }>) {\r\n if(options) {\r\n safeAssign(this, options);\r\n }\r\n }\r\n\r\n public constructContainer(options: Partial<{\r\n color: 'transparent',\r\n bold: boolean\r\n }> = {}) {\r\n if(!this.preloader) {\r\n this.preloader = document.createElement('div');\r\n this.preloader.classList.add('preloader-container');\r\n\r\n if(options.color) {\r\n this.preloader.classList.add('preloader-' + options.color);\r\n }\r\n\r\n if(options.bold) {\r\n this.preloader.classList.add('preloader-bold');\r\n }\r\n \r\n if(this.streamable) {\r\n this.preloader.classList.add('preloader-streamable');\r\n }\r\n }\r\n }\r\n\r\n public constructDownloadIcon() {\r\n this.constructContainer();\r\n }\r\n\r\n public construct() {\r\n this.construct = null;\r\n\r\n this.constructContainer();\r\n \r\n this.preloader.innerHTML = `\r\n <div class=\"you-spin-me-round\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" class=\"preloader-circular\" viewBox=\"${this.streamable ? '25 25 50 50' : '27 27 54 54'}\">\r\n <circle class=\"preloader-path-new\" cx=\"${this.streamable ? '50' : '54'}\" cy=\"${this.streamable ? '50' : '54'}\" r=\"${this.streamable ? 19 : 24}\" fill=\"none\" stroke-miterlimit=\"10\"/>\r\n </svg>\r\n </div>`;\r\n\r\n if(this.streamable) {\r\n this.totalLength = 118.61124420166016;\r\n } else {\r\n this.totalLength = 149.82473754882812;\r\n }\r\n\r\n if(this.cancelable) {\r\n this.preloader.innerHTML += `\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" class=\"preloader-close\" viewBox=\"0 0 24 24\">\r\n <g fill=\"none\" fill-rule=\"evenodd\">\r\n <polygon points=\"0 0 24 0 24 24 0 24\"/>\r\n <path fill=\"#000\" fill-rule=\"nonzero\" d=\"M5.20970461,5.38710056 L5.29289322,5.29289322 C5.65337718,4.93240926 6.22060824,4.90467972 6.61289944,5.20970461 L6.70710678,5.29289322 L12,10.585 L17.2928932,5.29289322 C17.6834175,4.90236893 18.3165825,4.90236893 18.7071068,5.29289322 C19.0976311,5.68341751 19.0976311,6.31658249 18.7071068,6.70710678 L13.415,12 L18.7071068,17.2928932 C19.0675907,17.6533772 19.0953203,18.2206082 18.7902954,18.6128994 L18.7071068,18.7071068 C18.3466228,19.0675907 17.7793918,19.0953203 17.3871006,18.7902954 L17.2928932,18.7071068 L12,13.415 L6.70710678,18.7071068 C6.31658249,19.0976311 5.68341751,19.0976311 5.29289322,18.7071068 C4.90236893,18.3165825 4.90236893,17.6834175 5.29289322,17.2928932 L10.585,12 L5.29289322,6.70710678 C4.93240926,6.34662282 4.90467972,5.77939176 5.20970461,5.38710056 L5.29289322,5.29289322 L5.20970461,5.38710056 Z\"/>\r\n </g>\r\n </svg>\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" class=\"preloader-download\" viewBox=\"0 0 24 24\">\r\n <g fill=\"none\" fill-rule=\"evenodd\">\r\n <polygon points=\"0 0 24 0 24 24 0 24\"/>\r\n <path fill=\"#000\" fill-rule=\"nonzero\" d=\"M5,19 L19,19 C19.5522847,19 20,19.4477153 20,20 C20,20.5128358 19.6139598,20.9355072 19.1166211,20.9932723 L19,21 L5,21 C4.44771525,21 4,20.5522847 4,20 C4,19.4871642 4.38604019,19.0644928 4.88337887,19.0067277 L5,19 L19,19 L5,19 Z M11.8833789,3.00672773 L12,3 C12.5128358,3 12.9355072,3.38604019 12.9932723,3.88337887 L13,4 L13,13.585 L16.2928932,10.2928932 C16.6533772,9.93240926 17.2206082,9.90467972 17.6128994,10.2097046 L17.7071068,10.2928932 C18.0675907,10.6533772 18.0953203,11.2206082 17.7902954,11.6128994 L17.7071068,11.7071068 L12.7071068,16.7071068 C12.3466228,17.0675907 11.7793918,17.0953203 11.3871006,16.7902954 L11.2928932,16.7071068 L6.29289322,11.7071068 C5.90236893,11.3165825 5.90236893,10.6834175 6.29289322,10.2928932 C6.65337718,9.93240926 7.22060824,9.90467972 7.61289944,10.2097046 L7.70710678,10.2928932 L11,13.585 L11,4 C11,3.48716416 11.3860402,3.06449284 11.8833789,3.00672773 L12,3 L11.8833789,3.00672773 Z\"/>\r\n </g>\r\n </svg>`;\r\n\r\n this.downloadSvg = this.preloader.lastElementChild as HTMLElement;\r\n this.cancelSvg = this.downloadSvg.previousElementSibling as any;\r\n } else {\r\n this.preloader.classList.add('preloader-swing');\r\n }\r\n \r\n this.circle = this.preloader.firstElementChild.firstElementChild.firstElementChild as SVGCircleElement;\r\n\r\n if(this.cancelable) {\r\n attachClickEvent(this.preloader, this.onClick);\r\n }\r\n }\r\n\r\n public onClick = (e?: Event) => {\r\n if(e) {\r\n cancelEvent(e);\r\n }\r\n\r\n if(this.preloader.classList.contains('manual')) {\r\n if(this.loadFunc) {\r\n this.loadFunc(e);\r\n }\r\n } else {\r\n if(this.promise && this.promise.cancel) {\r\n this.promise.cancel();\r\n }\r\n }\r\n };\r\n\r\n public setDownloadFunction(func: ProgressivePreloader['loadFunc']) {\r\n this.loadFunc = func;\r\n }\r\n\r\n public setManual() {\r\n this.preloader.classList.add('manual');\r\n this.setProgress(0);\r\n }\r\n\r\n public attachPromise(promise: CancellablePromise<any>) {\r\n if(this.isUpload && this.promise) return;\r\n\r\n this.promise = promise;\r\n\r\n const tempId = --this.tempId;\r\n const startTime = Date.now();\r\n\r\n const onEnd = (err: Error) => {\r\n promise.notify = promise.notifyAll = null;\r\n\r\n if(tempId !== this.tempId) {\r\n return;\r\n }\r\n\r\n const elapsedTime = Date.now() - startTime;\r\n\r\n //console.log('[PP]: end', this.detached, performance.now());\r\n\r\n if(!err && this.cancelable) {\r\n this.setProgress(100);\r\n\r\n const delay = TRANSITION_TIME * 0.75;\r\n\r\n if(elapsedTime < delay) {\r\n this.detach();\r\n } else {\r\n setTimeout(() => { // * wait for transition complete\r\n if(tempId === this.tempId) {\r\n this.detach();\r\n }\r\n }, delay);\r\n }\r\n } else {\r\n if(this.tryAgainOnFail) {\r\n this.attach(this.preloader.parentElement);\r\n fastRaf(() => {\r\n this.setManual();\r\n });\r\n } else {\r\n this.detach();\r\n }\r\n }\r\n \r\n this.promise = promise = null;\r\n };\r\n \r\n promise\r\n .then(() => onEnd(null))\r\n .catch((err) => onEnd(err));\r\n\r\n if(promise.addNotifyListener) {\r\n promise.addNotifyListener((details: {done: number, total: number}) => {\r\n /* if(details.done >= details.total) {\r\n onEnd();\r\n } */\r\n\r\n if(tempId !== this.tempId) return;\r\n\r\n //console.log('preloader download', promise, details);\r\n const percents = details.done / details.total * 100;\r\n this.setProgress(percents);\r\n });\r\n }\r\n }\r\n\r\n public attach(elem: Element, reset = false, promise?: CancellablePromise<any>) {\r\n if(this.construct) {\r\n this.construct();\r\n }\r\n\r\n if(this.preloader.parentElement) {\r\n this.preloader.classList.remove('manual');\r\n }\r\n\r\n this.detached = false;\r\n\r\n if(promise/* && false */) {\r\n this.attachPromise(promise);\r\n }\r\n\r\n if(this.detached || this.preloader.parentElement !== elem) {\r\n const useRafs = isInDOM(this.preloader) ? 1 : 2;\r\n if(this.preloader.parentElement !== elem) {\r\n elem[this.attachMethod](this.preloader);\r\n }\r\n\r\n SetTransition(this.preloader, 'is-visible', true, TRANSITION_TIME, undefined, useRafs);\r\n }\r\n\r\n if(this.cancelable && reset) {\r\n this.setProgress(0);\r\n }\r\n }\r\n \r\n public detach() {\r\n if(this.detached) {\r\n return;\r\n }\r\n //return;\r\n\r\n this.detached = true;\r\n\r\n //return;\r\n \r\n if(this.preloader && this.preloader.parentElement) {\r\n /* setTimeout(() => *///fastRaf(() => {\r\n /* if(!this.detached) return;\r\n this.detached = true; */\r\n\r\n // fastRaf(() => {\r\n //console.log('[PP]: detach after rAF', this.detached, performance.now());\r\n\r\n // if(!this.detached || !this.preloader.parentElement) {\r\n // return;\r\n // }\r\n\r\n SetTransition(this.preloader, 'is-visible', false, TRANSITION_TIME, () => {\r\n this.preloader.remove();\r\n }, 1);\r\n // });\r\n //})/* , 5e3) */;\r\n }\r\n }\r\n \r\n public setProgress(percents: number) {\r\n if(!this.totalLength && !isInDOM(this.circle)) {\r\n return;\r\n }\r\n \r\n if(percents === 0) {\r\n this.circle.style.strokeDasharray = '';\r\n return;\r\n }\r\n \r\n try {\r\n if(!this.totalLength) {\r\n this.totalLength = this.circle.getTotalLength();\r\n }\r\n\r\n //console.log('setProgress', (percents / 100 * totalLength));\r\n this.circle.style.strokeDasharray = '' + Math.max(5, percents / 100 * this.totalLength) + ', ' + this.totalLength;\r\n } catch(err) {}\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { makeMediaSize, MediaSize } from \"./mediaSizes\";\r\nimport { pause } from \"./schedulers/pause\";\r\nimport { IS_APPLE_MOBILE } from \"../environment/userAgent\";\r\n\r\nexport function scaleMediaElement(options: {\r\n media: CanvasImageSource, \r\n mediaSize: MediaSize, \r\n boxSize: MediaSize, \r\n quality?: number,\r\n mimeType?: 'image/jpeg' | 'image/png'\r\n}): Promise<{blob: Blob, size: MediaSize}> {\r\n return new Promise((resolve) => {\r\n const canvas = document.createElement('canvas');\r\n const size = options.mediaSize.aspectFitted(options.boxSize);\r\n canvas.width = size.width * window.devicePixelRatio;\r\n canvas.height = size.height * window.devicePixelRatio;\r\n const ctx = canvas.getContext('2d');\r\n ctx.drawImage(options.media, 0, 0, canvas.width, canvas.height);\r\n canvas.toBlob(blob => {\r\n resolve({blob, size});\r\n }, options.mimeType ?? 'image/jpeg', options.quality ?? 1);\r\n });\r\n}\r\n\r\nexport function preloadVideo(url: string): Promise<HTMLVideoElement> {\r\n return new Promise((resolve, reject) => {\r\n const video = document.createElement('video');\r\n video.volume = 0;\r\n video.addEventListener('loadedmetadata', () => resolve(video), {once: true});\r\n video.addEventListener('error', reject, {once: true});\r\n video.src = url;\r\n });\r\n}\r\n\r\nexport function createPosterFromMedia(media: HTMLVideoElement | HTMLImageElement) {\r\n let width: number, height: number;\r\n if(media instanceof HTMLVideoElement) {\r\n width = media.videoWidth;\r\n height = media.videoHeight;\r\n } else {\r\n width = media.naturalWidth;\r\n height = media.naturalHeight;\r\n }\r\n\r\n return scaleMediaElement({\r\n media, \r\n mediaSize: makeMediaSize(width, height), \r\n boxSize: makeMediaSize(320, 240),\r\n quality: .9\r\n });\r\n}\r\n\r\nexport function createPosterFromVideo(video: HTMLVideoElement): ReturnType<typeof scaleMediaElement> {\r\n return new Promise((resolve, reject) => {\r\n video.onseeked = () => {\r\n video.onseeked = () => {\r\n createPosterFromMedia(video).then(resolve);\r\n\r\n video.onseeked = undefined;\r\n };\r\n\r\n video.currentTime = 0;\r\n };\r\n \r\n video.onerror = reject;\r\n video.currentTime = Math.min(video.duration, 1);\r\n });\r\n}\r\n\r\nexport async function createPosterForVideo(url: string) {\r\n const video = await preloadVideo(url);\r\n\r\n return Promise.race([\r\n pause(2000) as Promise<undefined>,\r\n createPosterFromVideo(video),\r\n ]);\r\n}\r\n\r\nexport function onMediaLoad(media: HTMLMediaElement, readyState = media.HAVE_METADATA, useCanplayOnIos?: boolean) {\r\n return new Promise<void>((resolve) => {\r\n if(media.readyState >= readyState) {\r\n resolve();\r\n return;\r\n }\r\n\r\n media.addEventListener(IS_APPLE_MOBILE && !useCanplayOnIos ? 'loadeddata' : 'canplay', () => resolve(), {once: true});\r\n });\r\n}\r\n\r\nexport async function getFilesFromEvent(e: ClipboardEvent | DragEvent, onlyTypes = false): Promise<any[]> {\r\n const files: any[] = [];\r\n\r\n const scanFiles = async(entry: any, item: DataTransferItem) => {\r\n if(entry.isDirectory) {\r\n const directoryReader = entry.createReader();\r\n await new Promise<void>((resolve, reject) => {\r\n directoryReader.readEntries(async(entries: any) => {\r\n for(const entry of entries) {\r\n await scanFiles(entry, item);\r\n }\r\n\r\n resolve();\r\n });\r\n });\r\n } else if(entry) {\r\n if(onlyTypes) {\r\n files.push(entry.type);\r\n } else {\r\n const itemFile = item.getAsFile(); // * Safari can't handle entry.file with pasting\r\n const file = entry instanceof File ? \r\n entry : \r\n (\r\n entry instanceof DataTransferItem ? \r\n entry.getAsFile() : \r\n await new Promise((resolve, reject) => entry.file(resolve, (err: any) => resolve(itemFile)))\r\n );\r\n\r\n /* if(!onlyTypes) {\r\n console.log('getFilesFromEvent: got file', item, file);\r\n } */\r\n\r\n if(!file) return;\r\n files.push(file);\r\n }\r\n }\r\n };\r\n\r\n if(e instanceof DragEvent && e.dataTransfer.files && !e.dataTransfer.items) {\r\n for(let i = 0; i < e.dataTransfer.files.length; i++) {\r\n const file = e.dataTransfer.files[i];\r\n files.push(onlyTypes ? file.type : file);\r\n }\r\n } else {\r\n // @ts-ignore\r\n const items = (e.dataTransfer || e.clipboardData || e.originalEvent.clipboardData).items;\r\n\r\n const promises: Promise<any>[] = [];\r\n for(let i = 0; i < items.length; ++i) {\r\n const item: DataTransferItem = items[i];\r\n if(item.kind === 'file') {\r\n const entry = (onlyTypes ? item : item.webkitGetAsEntry()) || item.getAsFile();\r\n promises.push(scanFiles(entry, item));\r\n }\r\n }\r\n \r\n await Promise.all(promises);\r\n }\r\n\r\n /* if(!onlyTypes) {\r\n console.log('getFilesFromEvent: got files:', e, files);\r\n } */\r\n \r\n return files;\r\n}\r\n\r\nexport function requestFile(accept?: string) {\r\n const input = document.createElement('input');\r\n input.type = 'file';\r\n input.style.display = 'none';\r\n\r\n if(accept) {\r\n input.accept = accept;\r\n }\r\n\r\n document.body.append(input);\r\n\r\n const promise = new Promise<File>((resolve, reject) => {\r\n input.addEventListener('change', (e: any) => {\r\n const file: File = e.target.files[0];\r\n if(!file) {\r\n reject('NO_FILE_SELECTED');\r\n return;\r\n }\r\n \r\n resolve(file);\r\n }, {once: true});\r\n }).finally(() => {\r\n input.remove();\r\n });\r\n\r\n input.click();\r\n\r\n return promise;\r\n}\r\n","'use strict'\n//@flow\n\n/** * * * * * * * * * *\n * Big Integer Library *\n * Created 2000 *\n * Leemon Baird *\n * www.leemon.com *\n * * * * * * * * * * * */\n\n////////////////////////////////////////////////////////////////////////////////////////\n// These functions are designed to avoid frequent dynamic memory allocation in the inner loop.\n// For most functions, if it needs a BigInt as a local variable it will actually use\n// a global, and will only allocate to it only when it's not the right size. This ensures\n// that when a function is called repeatedly with same-sized parameters, it only allocates\n// memory on the first call.\n//\n// Note that for cryptographic purposes, the calls to Math.random() must\n// be replaced with calls to a better pseudorandom number generator.\n//\n// In the following, \"bigInt\" means a bigInt with at least one leading zero element,\n// and \"integer\" means a nonnegative integer less than radix. In some cases, integer\n// can be negative. Negative bigInts are 2s complement.\n//\n// The following functions do not modify their inputs.\n// Those returning a bigInt, string, or Array will dynamically allocate memory for that value.\n// Those returning a boolean will return the integer 0 (false) or 1 (true).\n// Those returning boolean or int will not allocate memory except possibly on the first\n// time they're called with a given parameter size.\n//\n// bigInt add(x,y) //return (x+y) for bigInts x and y.\n// bigInt addInt(x,n) //return (x+n) where x is a bigInt and n is an integer.\n// string bigInt2str(x,base) //return a string form of bigInt x in a given base, with 2 <= base <= 95\n// int bitSize(x) //return how many bits long the bigInt x is, not counting leading zeros\n// bigInt dup(x) //return a copy of bigInt x\n// boolean equals(x,y) //is the bigInt x equal to the bigint y?\n// boolean equalsInt(x,y) //is bigint x equal to integer y?\n// bigInt expand(x,n) //return a copy of x with at least n elements, adding leading zeros if needed\n// Array findPrimes(n) //return array of all primes less than integer n\n// bigInt GCD(x,y) //return greatest common divisor of bigInts x and y (each with same number of elements).\n// boolean greater(x,y) //is x>y? (x and y are nonnegative bigInts)\n// boolean greaterShift(x,y,shift)//is (x <<(shift*bpe)) > y?\n// bigInt int2bigInt(t,n,m) //return a bigInt equal to integer t, with at least n bits and m array elements\n// bigInt inverseMod(x,n) //return (x**(-1) mod n) for bigInts x and n. If no inverse exists, it returns null\n// int inverseModInt(x,n) //return x**(-1) mod n, for integers x and n. Return 0 if there is no inverse\n// boolean isZero(x) //is the bigInt x equal to zero?\n// boolean millerRabin(x,b) //does one round of Miller-Rabin base integer b say that bigInt x is possibly prime? (b is bigInt, 1<b<x)\n// boolean millerRabinInt(x,b) //does one round of Miller-Rabin base integer b say that bigInt x is possibly prime? (b is int, 1<b<x)\n// bigInt mod(x,n) //return a new bigInt equal to (x mod n) for bigInts x and n.\n// int modInt(x,n) //return x mod n for bigInt x and integer n.\n// bigInt mult(x,y) //return x*y for bigInts x and y. This is faster when y<x.\n// bigInt multMod(x,y,n) //return (x*y mod n) for bigInts x,y,n. For greater speed, let y<x.\n// boolean negative(x) //is bigInt x negative?\n// bigInt powMod(x,y,n) //return (x**y mod n) where x,y,n are bigInts and ** is exponentiation. 0**0=1. Faster for odd n.\n// bigInt randBigInt(n,s) //return an n-bit random BigInt (n>=1). If s=1, then the most significant of those n bits is set to 1.\n// bigInt randTruePrime(k) //return a new, random, k-bit, true prime bigInt using Maurer's algorithm.\n// bigInt randProbPrime(k) //return a new, random, k-bit, probable prime bigInt (probability it's composite less than 2^-80).\n// bigInt str2bigInt(s,b,n,m) //return a bigInt for number represented in string s in base b with at least n bits and m array elements\n// bigInt sub(x,y) //return (x-y) for bigInts x and y. Negative answers will be 2s complement\n// bigInt trim(x,k) //return a copy of x with exactly k leading zero elements\n//\n//\n// The following functions each have a non-underscored version, which most users should call instead.\n// These functions each write to a single parameter, and the caller is responsible for ensuring the array\n// passed in is large enough to hold the result.\n//\n// void addInt_(x,n) //do x=x+n where x is a bigInt and n is an integer\n// void add_(x,y) //do x=x+y for bigInts x and y\n// void copy_(x,y) //do x=y on bigInts x and y\n// void copyInt_(x,n) //do x=n on bigInt x and integer n\n// void GCD_(x,y) //set x to the greatest common divisor of bigInts x and y, (y is destroyed). (This never overflows its array).\n// boolean inverseMod_(x,n) //do x=x**(-1) mod n, for bigInts x and n. Returns 1 (0) if inverse does (doesn't) exist\n// void mod_(x,n) //do x=x mod n for bigInts x and n. (This never overflows its array).\n// void mult_(x,y) //do x=x*y for bigInts x and y.\n// void multMod_(x,y,n) //do x=x*y mod n for bigInts x,y,n.\n// void powMod_(x,y,n) //do x=x**y mod n, where x,y,n are bigInts (n is odd) and ** is exponentiation. 0**0=1.\n// void randBigInt_(b,n,s) //do b = an n-bit random BigInt. if s=1, then nth bit (most significant bit) is set to 1. n>=1.\n// void randTruePrime_(ans,k) //do ans = a random k-bit true random prime (not just probable prime) with 1 in the msb.\n// void sub_(x,y) //do x=x-y for bigInts x and y. Negative answers will be 2s complement.\n//\n// The following functions do NOT have a non-underscored version.\n// They each write a bigInt result to one or more parameters. The caller is responsible for\n// ensuring the arrays passed in are large enough to hold the results.\n//\n// void addShift_(x,y,ys) //do x=x+(y<<(ys*bpe))\n// void carry_(x) //do carries and borrows so each element of the bigInt x fits in bpe bits.\n// void divide_(x,y,q,r) //divide x by y giving quotient q and remainder r\n// int divInt_(x,n) //do x=floor(x/n) for bigInt x and integer n, and return the remainder. (This never overflows its array).\n// void eGCD_(x,y,d,a,b) //sets a,b,d to positive bigInts such that d = GCD_(x,y) = a*x-b*y\n// void halve_(x) //do x=floor(|x|/2)*sgn(x) for bigInt x in 2's complement. (This never overflows its array).\n// void leftShift_(x,n) //left shift bigInt x by n bits. n<bpe.\n// void linComb_(x,y,a,b) //do x=a*x+b*y for bigInts x and y and integers a and b\n// void linCombShift_(x,y,b,ys) //do x=x+b*(y<<(ys*bpe)) for bigInts x and y, and integers b and ys\n// void mont_(x,y,n,np) //Montgomery multiplication (see comments where the function is defined)\n// void multInt_(x,n) //do x=x*n where x is a bigInt and n is an integer.\n// void rightShift_(x,n) //right shift bigInt x by n bits. 0 <= n < bpe. (This never overflows its array).\n// void squareMod_(x,n) //do x=x*x mod n for bigInts x,n\n// void subShift_(x,y,ys) //do x=x-(y<<(ys*bpe)). Negative answers will be 2s complement.\n//\n// The following functions are based on algorithms from the _Handbook of Applied Cryptography_\n// powMod_() = algorithm 14.94, Montgomery exponentiation\n// eGCD_,inverseMod_() = algorithm 14.61, Binary extended GCD_\n// GCD_() = algorothm 14.57, Lehmer's algorithm\n// mont_() = algorithm 14.36, Montgomery multiplication\n// divide_() = algorithm 14.20 Multiple-precision division\n// squareMod_() = algorithm 14.16 Multiple-precision squaring\n// randTruePrime_() = algorithm 4.62, Maurer's algorithm\n// millerRabin() = algorithm 4.24, Miller-Rabin algorithm\n//\n// Profiling shows:\n// randTruePrime_() spends:\n// 10% of its time in calls to powMod_()\n// 85% of its time in calls to millerRabin()\n// millerRabin() spends:\n// 99% of its time in calls to powMod_() (always with a base of 2)\n// powMod_() spends:\n// 94% of its time in calls to mont_() (almost always with x==y)\n//\n// This suggests there are several ways to speed up this library slightly:\n// - convert powMod_ to use a Montgomery form of k-ary window (or maybe a Montgomery form of sliding window)\n// -- this should especially focus on being fast when raising 2 to a power mod n\n// - convert randTruePrime_() to use a minimum r of 1/3 instead of 1/2 with the appropriate change to the test\n// - tune the parameters in randTruePrime_(), including c, m, and recLimit\n// - speed up the single loop in mont_() that takes 95% of the runtime, perhaps by reducing checking\n// within the loop when all the parameters are the same length.\n//\n// There are several ideas that look like they wouldn't help much at all:\n// - replacing trial division in randTruePrime_() with a sieve (that speeds up something taking almost no time anyway)\n// - increase bpe from 15 to 30 (that would help if we had a 32*32->64 multiplier, but not with JavaScript's 32*32->32)\n// - speeding up mont_(x,y,n,np) when x==y by doing a non-modular, non-Montgomery square\n// followed by a Montgomery reduction. The intermediate answer will be twice as long as x, so that\n// method would be slower. This is unfortunate because the code currently spends almost all of its time\n// doing mont_(x,x,...), both for randTruePrime_() and powMod_(). A faster method for Montgomery squaring\n// would have a large impact on the speed of randTruePrime_() and powMod_(). HAC has a couple of poorly-worded\n// sentences that seem to imply it's faster to do a non-modular square followed by a single\n// Montgomery reduction, but that's obviously wrong.\n////////////////////////////////////////////////////////////////////////////////////////\n\nexport type Bool = 1 | 0\n\n//globals\nexport var bpe = 0 //bits stored per array element\nvar mask = 0 //AND this with an array element to chop it down to bpe bits\nvar radix = mask + 1 //equals 2^bpe. A single 1 bit to the left of the last bit of mask.\n\n//the digits for converting to different bases\nvar digitsStr =\n '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_=!@#$%^&*()[]{}|;:,.<>/?`~ \\\\\\'\"+-'\n\n//initialize the global variables\n\n//bpe=number of bits in the mantissa on this platform\nfor (bpe = 0; 1 << (bpe + 1) > 1 << bpe; bpe++);\nbpe >>= 1 //bpe=number of bits in one element of the array representing the bigInt\nmask = (1 << bpe) - 1 //AND the mask with an integer to get its bpe least significant bits\nradix = mask + 1 //2^bpe. a single 1 bit to the left of the first bit of mask\nexport var one = int2bigInt(1, 1, 1) //constant used in powMod_()\nexport var zero = int2bigInt(0, 1, 1)\n\n//the following global variables are scratchpad memory to\n//reduce dynamic memory allocation in the inner loop\nvar t: number[] | number = new Array(0)\nvar ss = t //used in mult_()\nvar s0 = t //used in multMod_(), squareMod_()\n// var s1=t; //used in powMod_(), multMod_(), squareMod_()\n// var s2=t; //used in powMod_(), multMod_()\nvar s3 = t //used in powMod_()\nvar s4 = t,\n s5 = t //used in mod_()\nvar s6 = t //used in bigInt2str()\nvar s7 = t //used in powMod_()\nvar T = t //used in GCD_()\nvar sa = t //used in mont_()\nvar mr_x1 = t,\n mr_r = t,\n mr_a = t, //used in millerRabin()\n eg_v = t,\n eg_u = t,\n eg_A = t,\n eg_B = t,\n eg_C = t,\n eg_D = t, //used in eGCD_(), inverseMod_()\n //, md_q1=t, md_q2=t, md_q3=t, md_r=t, md_r1=t, md_r2=t, md_tt=t, //used in mod_()\n\n primes = t,\n pows = t,\n s_i = t,\n s_i2 = t,\n s_R = t,\n s_rm = t,\n s_q = t,\n s_n1 = t,\n s_a = t,\n s_r2 = t,\n s_n = t,\n s_b = t,\n s_d = t,\n s_x1 = t,\n s_x2 = t,\n s_aa = t, //used in randTruePrime_()\n rpprb = t //used in randProbPrimeRounds() (which also uses \"primes\")\n\n////////////////////////////////////////////////////////////////////////////////////////\n\nvar k, buff\n\n/**\n * return array of all primes less than integer n\n *\n * @param {number} n\n * @returns {number[]}\n */\nexport function findPrimes(n: number): number[] {\n var i, s, p, ans\n s = new Array(n)\n for (i = 0; i < n; i++) s[i] = 0\n s[0] = 2\n p = 0 //first p elements of s are primes, the rest are a sieve\n for (; s[p] < n; ) {\n //s[p] is the pth prime\n for (\n i = s[p] * s[p];\n i < n;\n i += s[p] //mark multiples of s[p]\n )\n s[i] = 1\n p++\n s[p] = s[p - 1] + 1\n for (; s[p] < n && s[s[p]]; s[p]++); //find next prime (where s[p]==0)\n }\n ans = new Array(p)\n for (i = 0; i < p; i++) ans[i] = s[i]\n return ans\n}\n\n/**\n * does a single round of Miller-Rabin base b consider x to be a possible prime?\n *\n * x is a bigInt, and b is an integer, with b<x\n *\n * @export\n * @param {number[]} x\n * @param {number} b\n * @returns {(0 | 1)}\n */\nexport function millerRabinInt(x: number[], b: number): Bool {\n if (mr_x1.length !== x.length) {\n mr_x1 = dup(x)\n mr_r = dup(x)\n mr_a = dup(x)\n }\n\n copyInt_(mr_a, b)\n return millerRabin(x, mr_a)\n}\n\n/**\n * does a single round of Miller-Rabin base b consider x to be a possible prime?\n *\n * x and b are bigInts with b<x\n *\n * @export\n * @param {number[]} x\n * @param {number[]} b\n * @returns {(0 | 1)}\n */\nexport function millerRabin(x: number[], b: number[]): Bool {\n var i, j, k, s\n\n if (mr_x1.length !== x.length) {\n mr_x1 = dup(x)\n mr_r = dup(x)\n mr_a = dup(x)\n }\n\n copy_(mr_a, b)\n copy_(mr_r, x)\n copy_(mr_x1, x)\n\n addInt_(mr_r, -1)\n addInt_(mr_x1, -1)\n\n //s=the highest power of two that divides mr_r\n k = 0\n for (i = 0; i < mr_r.length; i++)\n for (j = 1; j < mask; j <<= 1)\n if (x[i] & j) {\n s = k < mr_r.length + bpe ? k : 0\n i = mr_r.length\n j = mask\n } else k++\n\n if (s) rightShift_(mr_r, s)\n\n powMod_(mr_a, mr_r, x)\n\n if (!equalsInt(mr_a, 1) && !equals(mr_a, mr_x1)) {\n j = 1\n //$off\n while (j <= s - 1 && !equals(mr_a, mr_x1)) {\n squareMod_(mr_a, x)\n if (equalsInt(mr_a, 1)) {\n return 0\n }\n j++\n }\n if (!equals(mr_a, mr_x1)) {\n return 0\n }\n }\n return 1\n}\n\n/**\n * returns how many bits long the bigInt is, not counting leading zeros.\n *\n * @param {number[]} x\n * @returns {number}\n */\nexport function bitSize(x: number[]): number {\n var j, z, w\n for (j = x.length - 1; x[j] == 0 && j > 0; j--);\n for (z = 0, w = x[j]; w; w >>= 1, z++);\n z += bpe * j\n return z\n}\n\n/**\n * return a copy of x with at least n elements, adding leading zeros if needed\n *\n * @param {number[]} x\n * @param {number} n\n * @returns {number[]}\n */\nexport function expand(x: number[], n: number): number[] {\n var ans = int2bigInt(0, (x.length > n ? x.length : n) * bpe, 0)\n copy_(ans, x)\n return ans\n}\n\n/**\n * return a k-bit true random prime using Maurer's algorithm.\n *\n * @export\n * @param {number} k\n * @returns {number[]}\n */\n/* export function randTruePrime(k: number): number[] {\n var ans = int2bigInt(0, k, 0)\n randTruePrime_(ans, k)\n return trim(ans, 1)\n} */\n\n/**\n * return a k-bit random probable prime with probability of error < 2^-80\n *\n * @export\n * @param {number} k\n * @returns {number[]}\n */\n/* export function randProbPrime(k: number): number[] {\n if (k >= 600) return randProbPrimeRounds(k, 2) //numbers from HAC table 4.3\n if (k >= 550) return randProbPrimeRounds(k, 4)\n if (k >= 500) return randProbPrimeRounds(k, 5)\n if (k >= 400) return randProbPrimeRounds(k, 6)\n if (k >= 350) return randProbPrimeRounds(k, 7)\n if (k >= 300) return randProbPrimeRounds(k, 9)\n if (k >= 250) return randProbPrimeRounds(k, 12) //numbers from HAC table 4.4\n if (k >= 200) return randProbPrimeRounds(k, 15)\n if (k >= 150) return randProbPrimeRounds(k, 18)\n if (k >= 100) return randProbPrimeRounds(k, 27)\n return randProbPrimeRounds(k, 40) //number from HAC remark 4.26 (only an estimate)\n} */\n\n/**\n * return a k-bit probable random prime using n rounds of Miller Rabin\n * (after trial division with small primes)\n *\n * @export\n * @param {number} k\n * @param {number} n\n * @returns {number[]}\n */\n/* export function randProbPrimeRounds(k: number, n: number): number[] {\n var ans, i, divisible, B\n B = 30000 //B is largest prime to use in trial division\n ans = int2bigInt(0, k, 0)\n\n //optimization: try larger and smaller B to find the best limit.\n\n if (primes.length === 0) primes = findPrimes(30000) //check for divisibility by primes <=30000\n\n if (rpprb.length !== ans.length) rpprb = dup(ans)\n\n for (;;) {\n //keep trying random values for ans until one appears to be prime\n //optimization: pick a random number times L=2*3*5*...*p, plus a\n // random element of the list of all numbers in [0,L) not divisible by any prime up to p.\n // This can reduce the amount of random number generation.\n\n randBigInt_(ans, k, 0) //ans = a random odd number to check\n ans[0] |= 1\n divisible = 0\n\n //check ans for divisibility by small primes up to B\n for (i = 0; i < primes.length && primes[i] <= B; i++)\n if (modInt(ans, primes[i]) === 0 && !equalsInt(ans, primes[i])) {\n divisible = 1\n break\n }\n\n //optimization: change millerRabin so the base can be bigger than the number being checked, then eliminate the while here.\n\n //do n rounds of Miller Rabin, with random bases less than ans\n for (i = 0; i < n && !divisible; i++) {\n randBigInt_(rpprb, k, 0)\n while (\n !greater(ans, rpprb) //pick a random rpprb that's < ans\n )\n randBigInt_(rpprb, k, 0)\n if (!millerRabin(ans, rpprb)) divisible = 1\n }\n\n if (!divisible) return ans\n }\n} */\n\n/**\n * return a new bigInt equal to (x mod n) for bigInts x and n.\n *\n * @param {number[]} x\n * @param {number[]} n\n * @returns {number[]}\n */\nexport function mod(x: number[], n: number[]): number[] {\n var ans = dup(x)\n mod_(ans, n)\n return trim(ans, 1)\n}\n\n/**\n * return (x+n) where x is a bigInt and n is an integer.\n *\n * @export\n * @param {number[]} x\n * @param {number} n\n * @returns {number[]}\n */\n/* export function addInt(x: number[], n: number): number[] {\n var ans = expand(x, x.length + 1)\n addInt_(ans, n)\n return trim(ans, 1)\n} */\n\n/**\n * return x*y for bigInts x and y. This is faster when y<x.\n *\n * @export\n * @param {number[]} x\n * @param {number[]} y\n * @returns {number[]}\n */\nexport function mult(x: number[], y: number[]): number[] {\n var ans = expand(x, x.length + y.length)\n mult_(ans, y)\n return trim(ans, 1)\n}\n\n/**\n * return (x**y mod n) where x,y,n are bigInts and ** is exponentiation.\n *\n * 0**0=1.\n *\n * Faster for odd n.\n *\n * @export\n * @param {number[]} x\n * @param {number[]} y\n * @param {number[]} n\n * @returns {number[]}\n */\nexport function powMod(x: number[], y: number[], n: number[]): number[] {\n var ans = expand(x, n.length)\n powMod_(\n //this should work without the trim, but doesn't\n ans,\n trim(y, 2),\n trim(n, 2),\n )\n return trim(ans, 1)\n}\n\n/**\n * Simple pow with no optimizations (in 40x times slower than jsbn's pow)\n * @param x bigInt\n * @param e\n */\nexport function pow(x: number[], e: number) {\n let ans = dup(x);\n e -= 1;\n for(let i = 0; i < e; ++i) {\n ans = mult(ans, x);\n }\n return trim(ans, 1);\n}\n\n/**\n * return (x-y) for bigInts x and y\n *\n * Negative answers will be 2s complement\n *\n * @export\n * @param {number[]} x\n * @param {number[]} y\n * @returns {number[]}\n */\nexport function sub(x: number[], y: number[]): number[] {\n var ans = expand(x, x.length > y.length ? x.length + 1 : y.length + 1)\n sub_(ans, y)\n return trim(ans, 1)\n}\n\n/**\n * return (x+y) for bigInts x and y\n *\n * @export\n * @param {number[]} x\n * @param {number[]} y\n * @returns {number[]}\n */\nexport function add(x: number[], y: number[]): number[] {\n var ans = expand(x, x.length > y.length ? x.length + 1 : y.length + 1)\n add_(ans, y)\n return trim(ans, 1)\n}\n\n/**\n * return (x**(-1) mod n) for bigInts x and n.\n *\n * If no inverse exists, it returns null\n *\n * @param {number[]} x\n * @param {number[]} n\n * @returns {(number[] | null)}\n */\n/* export function inverseMod(x: number[], n: number[]): number[] | null {\n var ans = expand(x, n.length)\n var s = inverseMod_(ans, n)\n return s ? trim(ans, 1) : null\n} */\n\n/**\n * return (x*y mod n) for bigInts x,y,n.\n *\n * For greater speed, let y<x.\n *\n * @export\n * @param {number[]} x\n * @param {number[]} y\n * @param {number[]} n\n * @returns {number[]}\n */\nexport function multMod(x: number[], y: number[], n: number[]): number[] {\n var ans = expand(x, n.length)\n multMod_(ans, y, n)\n return trim(ans, 1)\n}\n\n/**\n * generate a k-bit true random prime using Maurer's algorithm, and put it into ans.\n *\n * The bigInt ans must be large enough to hold it.\n *\n * @export\n * @param {number[]} ans\n * @param {number} k\n * @return {void}\n */\n/* export function randTruePrime_(ans: number[], k: number): void {\n var c, m, pm, dd, j, r, B, divisible, z, zz, recSize\n var w\n if (primes.length == 0) primes = findPrimes(30000) //check for divisibility by primes <=30000\n\n if (pows.length == 0) {\n pows = new Array(512)\n for (j = 0; j < 512; j++) {\n pows[j] = Math.pow(2, j / 511 - 1)\n }\n }\n\n //c and m should be tuned for a particular machine and value of k, to maximize speed\n c = 0.1 //c=0.1 in HAC\n m = 20 //generate this k-bit number by first recursively generating a number that has between k/2 and k-m bits\n var recLimit = 20 //stop recursion when k <=recLimit. Must have recLimit >= 2\n\n if (s_i2.length != ans.length) {\n s_i2 = dup(ans)\n s_R = dup(ans)\n s_n1 = dup(ans)\n s_r2 = dup(ans)\n s_d = dup(ans)\n s_x1 = dup(ans) //TODO Seems like a bug in eslint, reports as unused\n s_x2 = dup(ans)\n s_b = dup(ans)\n s_n = dup(ans)\n s_i = dup(ans)\n s_rm = dup(ans)\n s_q = dup(ans)\n s_a = dup(ans)\n s_aa = dup(ans)\n }\n\n if (k <= recLimit) {\n //generate small random primes by trial division up to its square root\n pm = (1 << ((k + 2) >> 1)) - 1 //pm is binary number with all ones, just over sqrt(2^k)\n copyInt_(ans, 0)\n for (dd = 1; dd; ) {\n dd = 0\n ans[0] = 1 | (1 << (k - 1)) | Math.floor(Math.random() * (1 << k)) //random, k-bit, odd integer, with msb 1\n for (j = 1; j < primes.length && (primes[j] & pm) == primes[j]; j++) {\n //trial division by all primes 3...sqrt(2^k)\n if (0 == ans[0] % primes[j]) {\n dd = 1\n break\n }\n }\n }\n carry_(ans)\n return\n }\n\n B = c * k * k //try small primes up to B (or all the primes[] array if the largest is less than B).\n if (k > 2 * m)\n //generate this k-bit number by first recursively generating a number that has between k/2 and k-m bits\n for (r = 1; k - k * r <= m; ) r = pows[Math.floor(Math.random() * 512)] //r=Math.pow(2,Math.random()-1);\n else r = 0.5\n\n //simulation suggests the more complex algorithm using r=.333 is only slightly faster.\n\n recSize = Math.floor(r * k) + 1\n\n randTruePrime_(s_q, recSize)\n copyInt_(s_i2, 0)\n s_i2[Math.floor((k - 2) / bpe)] |= 1 << ((k - 2) % bpe) //s_i2=2^(k-2)\n divide_(s_i2, s_q, s_i, s_rm) //s_i=floor((2^(k-1))/(2q))\n\n z = bitSize(s_i)\n\n for (;;) {\n for (;;) {\n //generate z-bit numbers until one falls in the range [0,s_i-1]\n randBigInt_(s_R, z, 0)\n if (greater(s_i, s_R)) break\n } //now s_R is in the range [0,s_i-1]\n addInt_(s_R, 1) //now s_R is in the range [1,s_i]\n add_(s_R, s_i) //now s_R is in the range [s_i+1,2*s_i]\n\n copy_(s_n, s_q)\n mult_(s_n, s_R)\n multInt_(s_n, 2)\n addInt_(s_n, 1) //s_n=2*s_R*s_q+1\n\n copy_(s_r2, s_R)\n multInt_(s_r2, 2) //s_r2=2*s_R\n\n //check s_n for divisibility by small primes up to B\n for (divisible = 0, j = 0; j < primes.length && primes[j] < B; j++)\n if (modInt(s_n, primes[j]) == 0 && !equalsInt(s_n, primes[j])) {\n divisible = 1\n break\n }\n\n if (!divisible)\n if (!millerRabinInt(s_n, 2))\n //if it passes small primes check, then try a single Miller-Rabin base 2\n //this line represents 75% of the total runtime for randTruePrime_\n divisible = 1\n\n if (!divisible) {\n //if it passes that test, continue checking s_n\n addInt_(s_n, -3)\n for (j = s_n.length - 1; s_n[j] == 0 && j > 0; j--); //strip leading zeros\n for (zz = 0, w = s_n[j]; w; w >>= 1, zz++);\n zz += bpe * j //zz=number of bits in s_n, ignoring leading zeros\n for (;;) {\n //generate z-bit numbers until one falls in the range [0,s_n-1]\n randBigInt_(s_a, zz, 0)\n if (greater(s_n, s_a)) break\n } //now s_a is in the range [0,s_n-1]\n addInt_(s_n, 3) //now s_a is in the range [0,s_n-4]\n addInt_(s_a, 2) //now s_a is in the range [2,s_n-2]\n copy_(s_b, s_a)\n copy_(s_n1, s_n)\n addInt_(s_n1, -1)\n powMod_(s_b, s_n1, s_n) //s_b=s_a^(s_n-1) modulo s_n\n addInt_(s_b, -1)\n if (isZero(s_b)) {\n copy_(s_b, s_a)\n powMod_(s_b, s_r2, s_n)\n addInt_(s_b, -1)\n copy_(s_aa, s_n)\n copy_(s_d, s_b)\n GCD_(s_d, s_n) //if s_b and s_n are relatively prime, then s_n is a prime\n if (equalsInt(s_d, 1)) {\n copy_(ans, s_aa)\n return //if we've made it this far, then s_n is absolutely guaranteed to be prime\n }\n }\n }\n }\n} */\n\n/**\n * Return an n-bit random BigInt (n>=1). If s=1, then the most significant of those n bits is set to 1.\n *\n * @export\n * @param {number} n\n * @param {number} s\n * @returns {number[]}\n */\n/* export function randBigInt(n: number, s: number): number[] {\n var a, b\n a = Math.floor((n - 1) / bpe) + 2 //# array elements to hold the BigInt with a leading 0 element\n b = int2bigInt(0, 0, a)\n randBigInt_(b, n, s)\n return b\n} */\n\n/**\n * Set b to an n-bit random BigInt. If s=1, then the most significant of those n bits is set to 1.\n *\n * Array b must be big enough to hold the result. Must have n>=1\n *\n * @export\n * @param {number[]} b\n * @param {number} n\n * @param {number} s\n * @return {void}\n */\n/* export function randBigInt_(b: number[], n: number, s: number): void {\n var i, a\n for (i = 0; i < b.length; i++) b[i] = 0\n a = Math.floor((n - 1) / bpe) + 1 //# array elements to hold the BigInt\n for (i = 0; i < a; i++) {\n b[i] = Math.floor(Math.random() * (1 << (bpe - 1)))\n }\n b[a - 1] &= (2 << ((n - 1) % bpe)) - 1\n if (s == 1) b[a - 1] |= 1 << ((n - 1) % bpe)\n} */\n\n/**\n * Return the greatest common divisor of bigInts x and y (each with same number of elements).\n *\n * @export\n * @param {number[]} x\n * @param {number[]} y\n * @returns {number[]}\n */\nexport function GCD(x: number[], y: number[]): number[] {\n var xc, yc\n xc = dup(x)\n yc = dup(y)\n GCD_(xc, yc)\n return xc\n}\n\n/**\n * set x to the greatest common divisor of bigInts x and y (each with same number of elements).\n *\n * y is destroyed.\n *\n * @export\n * @param {number[]} x\n * @param {number[]} y\n */\nexport function GCD_(x: number[], y: number[]): void {\n var i: number, xp: number, yp: number, A: number, B, C: number, D: number, q, sing\n var qp\n if (T.length !== x.length) T = dup(x)\n\n sing = 1\n while (sing) {\n //while y has nonzero elements other than y[0]\n sing = 0\n for (\n i = 1;\n i < y.length;\n i++ //check if y has nonzero elements other than 0\n )\n if (y[i]) {\n sing = 1\n break\n }\n if (!sing) break //quit when y all zero elements except possibly y[0]\n\n for (i = x.length; !x[i] && i >= 0; i--); //find most significant element of x\n xp = x[i]\n yp = y[i]\n A = 1\n B = 0\n C = 0\n D = 1\n while (yp + C && yp + D) {\n q = Math.floor((xp + A) / (yp + C))\n qp = Math.floor((xp + B) / (yp + D))\n if (q != qp) break\n t = A - q * C\n A = C\n C = t // do (A,B,xp, C,D,yp) = (C,D,yp, A,B,xp) - q*(0,0,0, C,D,yp)\n t = B - q * D\n B = D\n D = t\n t = xp - q * yp\n xp = yp\n yp = t\n }\n if (B) {\n copy_(T, x)\n linComb_(x, y, A, B) //x=A*x+B*y\n linComb_(y, T, D, C) //y=D*y+C*T\n } else {\n mod_(x, y)\n copy_(T, x)\n copy_(x, y)\n copy_(y, T)\n }\n }\n if (y[0] === 0) return\n t = modInt(x, y[0])\n copyInt_(x, y[0])\n y[0] = t\n while (y[0]) {\n x[0] %= y[0]\n t = x[0]\n x[0] = y[0]\n y[0] = t\n }\n}\n\n/**\n * do x=x**(-1) mod n, for bigInts x and n.\n *\n * If no inverse exists, it sets x to zero and returns 0, else it returns 1.\n * The x array must be at least as large as the n array.\n *\n * @export\n * @param {number[]} x\n * @param {number[]} n\n * @returns {(0 | 1)}\n */\n/* export function inverseMod_(x: number[], n: number[]): Bool {\n var k = 1 + 2 * Math.max(x.length, n.length)\n\n if (!(x[0] & 1) && !(n[0] & 1)) {\n //if both inputs are even, then inverse doesn't exist\n copyInt_(x, 0)\n return 0\n }\n\n if (eg_u.length != k) {\n eg_u = new Array(k)\n eg_v = new Array(k)\n eg_A = new Array(k)\n eg_B = new Array(k)\n eg_C = new Array(k)\n eg_D = new Array(k)\n }\n\n copy_(eg_u, x)\n copy_(eg_v, n)\n copyInt_(eg_A, 1)\n copyInt_(eg_B, 0)\n copyInt_(eg_C, 0)\n copyInt_(eg_D, 1)\n for (;;) {\n while (!(eg_u[0] & 1)) {\n //while eg_u is even\n halve_(eg_u)\n if (!(eg_A[0] & 1) && !(eg_B[0] & 1)) {\n //if eg_A==eg_B==0 mod 2\n halve_(eg_A)\n halve_(eg_B)\n } else {\n add_(eg_A, n)\n halve_(eg_A)\n sub_(eg_B, x)\n halve_(eg_B)\n }\n }\n\n while (!(eg_v[0] & 1)) {\n //while eg_v is even\n halve_(eg_v)\n if (!(eg_C[0] & 1) && !(eg_D[0] & 1)) {\n //if eg_C==eg_D==0 mod 2\n halve_(eg_C)\n halve_(eg_D)\n } else {\n add_(eg_C, n)\n halve_(eg_C)\n sub_(eg_D, x)\n halve_(eg_D)\n }\n }\n\n if (!greater(eg_v, eg_u)) {\n //eg_v <= eg_u\n sub_(eg_u, eg_v)\n sub_(eg_A, eg_C)\n sub_(eg_B, eg_D)\n } else {\n //eg_v > eg_u\n sub_(eg_v, eg_u)\n sub_(eg_C, eg_A)\n sub_(eg_D, eg_B)\n }\n\n if (equalsInt(eg_u, 0)) {\n while (\n negative(eg_C) //make sure answer is nonnegative\n )\n add_(eg_C, n)\n copy_(x, eg_C)\n\n if (!equalsInt(eg_v, 1)) {\n //if GCD_(x,n)!=1, then there is no inverse\n copyInt_(x, 0)\n return 0\n }\n return 1\n }\n }\n} */\n\n/**\n * return x**(-1) mod n, for integers x and n.\n *\n * Return 0 if there is no inverse\n *\n * @param {number} x\n * @param {number} n\n * @returns {number}\n */\nexport function inverseModInt(x: number, n: number): number {\n var a = 1,\n b = 0,\n t\n for (;;) {\n if (x === 1) return a\n if (x === 0) return 0\n b -= a * Math.floor(n / x)\n //$off\n n %= x\n\n if (n === 1) return b //to avoid negatives, change this b to n-b, and each -= to +=\n if (n === 0) return 0\n a -= b * Math.floor(x / n)\n //$off\n x %= n\n }\n /*::\n declare var never: empty\n return never\n */\n}\n\n//this deprecated function is for backward compatibility only.\n/* function inverseModInt_(x: number, n: number) {\n return inverseModInt(x, n)\n} */\n\n/**\n * Given positive bigInts x and y, change the bigints v, a, and b to positive bigInts such that:\n *\n * v = GCD_(x,y) = a*x-b*y\n *\n * The bigInts v, a, b, must have exactly as many elements as the larger of x and y.\n *\n * @export\n * @param {number[]} x\n * @param {number[]} y\n * @param {number[]} v\n * @param {number[]} a\n * @param {number[]} b\n * @return {void}\n */\nexport function eGCD_(\n x: number[],\n y: number[],\n v: number[],\n a: number[],\n b: number[],\n): void {\n var g = 0\n var k = Math.max(x.length, y.length)\n if (eg_u.length != k) {\n eg_u = new Array(k)\n eg_A = new Array(k)\n eg_B = new Array(k)\n eg_C = new Array(k)\n eg_D = new Array(k)\n }\n while (!(x[0] & 1) && !(y[0] & 1)) {\n //while x and y both even\n halve_(x)\n halve_(y)\n g++\n }\n copy_(eg_u, x)\n copy_(v, y)\n copyInt_(eg_A, 1)\n copyInt_(eg_B, 0)\n copyInt_(eg_C, 0)\n copyInt_(eg_D, 1)\n for (;;) {\n while (!(eg_u[0] & 1)) {\n //while u is even\n halve_(eg_u)\n if (!(eg_A[0] & 1) && !(eg_B[0] & 1)) {\n //if A==B==0 mod 2\n halve_(eg_A)\n halve_(eg_B)\n } else {\n add_(eg_A, y)\n halve_(eg_A)\n sub_(eg_B, x)\n halve_(eg_B)\n }\n }\n\n while (!(v[0] & 1)) {\n //while v is even\n halve_(v)\n if (!(eg_C[0] & 1) && !(eg_D[0] & 1)) {\n //if C==D==0 mod 2\n halve_(eg_C)\n halve_(eg_D)\n } else {\n add_(eg_C, y)\n halve_(eg_C)\n sub_(eg_D, x)\n halve_(eg_D)\n }\n }\n\n if (!greater(v, eg_u)) {\n //v<=u\n sub_(eg_u, v)\n sub_(eg_A, eg_C)\n sub_(eg_B, eg_D)\n } else {\n //v>u\n sub_(v, eg_u)\n sub_(eg_C, eg_A)\n sub_(eg_D, eg_B)\n }\n if (equalsInt(eg_u, 0)) {\n while (negative(eg_C)) {\n //make sure a (C) is nonnegative\n add_(eg_C, y)\n sub_(eg_D, x)\n }\n multInt_(eg_D, -1) ///make sure b (D) is nonnegative\n copy_(a, eg_C)\n copy_(b, eg_D)\n leftShift_(v, g)\n return\n }\n }\n}\n\n/**\n * is bigInt x negative?\n *\n * @param {number[]} x\n * @returns {(1 | 0)}\n */\nexport function negative(x: number[]) {\n //TODO Flow Bool type inference\n return (x[x.length - 1] >> (bpe - 1)) & 1\n}\n\n/**\n * is (x << (shift*bpe)) > y?\n *\n * x and y are nonnegative bigInts\n * shift is a nonnegative integer\n *\n * @param {number[]} x\n * @param {number[]} y\n * @param {number} shift\n * @returns {(1 | 0)}\n */\nexport function greaterShift(x: number[], y: number[], shift: number): Bool {\n var i,\n kx = x.length,\n ky = y.length\n k = kx + shift < ky ? kx + shift : ky\n for (i = ky - 1 - shift; i < kx && i >= 0; i++) if (x[i] > 0) return 1 //if there are nonzeros in x to the left of the first column of y, then x is bigger\n for (i = kx - 1 + shift; i < ky; i++) if (y[i] > 0) return 0 //if there are nonzeros in y to the left of the first column of x, then x is not bigger\n for (i = k - 1; i >= shift; i--)\n if (x[i - shift] > y[i]) return 1\n else if (x[i - shift] < y[i]) return 0\n return 0\n}\n\n/**\n * is x > y?\n *\n * x and y both nonnegative\n *\n * @export\n * @param {number[]} x\n * @param {number[]} y\n * @returns {(1 | 0)}\n */\nexport function greater(x: number[], y: number[]): Bool {\n var i\n var k = x.length < y.length ? x.length : y.length\n\n for (i = x.length; i < y.length; i++) if (y[i]) return 0 //y has more digits\n\n for (i = y.length; i < x.length; i++) if (x[i]) return 1 //x has more digits\n\n for (i = k - 1; i >= 0; i--)\n if (x[i] > y[i]) return 1\n else if (x[i] < y[i]) return 0\n return 0\n}\n\n/**\n * divide x by y giving quotient q and remainder r.\n *\n * q = floor(x/y)\n * r = x mod y\n *\n * All 4 are bigints.\n *\n * * x must have at least one leading zero element.\n * * y must be nonzero.\n * * q and r must be arrays that are exactly the same length as x. (Or q can have more).\n * * Must have x.length >= y.length >= 2.\n *\n * @export\n * @param {number[]} x\n * @param {number[]} y\n * @param {number[]} q\n * @param {number[]} r\n * @return {void}\n */\nexport function divide_(\n x: number[],\n y: number[],\n q: number[],\n r: number[],\n): void {\n var kx, ky\n var i, j, y1, y2, c, a, b\n copy_(r, x)\n for (ky = y.length; y[ky - 1] === 0; ky--); //ky is number of elements in y, not including leading zeros\n\n //normalize: ensure the most significant element of y has its highest bit set\n b = y[ky - 1]\n for (a = 0; b; a++) b >>= 1\n a = bpe - a //a is how many bits to shift so that the high order bit of y is leftmost in its array element\n leftShift_(y, a) //multiply both by 1<<a now, then divide both by that at the end\n leftShift_(r, a)\n\n //Rob Visser discovered a bug: the following line was originally just before the normalization.\n for (kx = r.length; r[kx - 1] === 0 && kx > ky; kx--); //kx is number of elements in normalized x, not including leading zeros\n\n copyInt_(q, 0) // q=0\n while (!greaterShift(y, r, kx - ky)) {\n // while (leftShift_(y,kx-ky) <= r) {\n subShift_(r, y, kx - ky) // r=r-leftShift_(y,kx-ky)\n q[kx - ky]++ // q[kx-ky]++;\n } // }\n\n for (i = kx - 1; i >= ky; i--) {\n if (r[i] == y[ky - 1]) q[i - ky] = mask\n else q[i - ky] = Math.floor((r[i] * radix + r[i - 1]) / y[ky - 1])\n\n //The following for(;;) loop is equivalent to the commented while loop,\n //except that the uncommented version avoids overflow.\n //The commented loop comes from HAC, which assumes r[-1]==y[-1]==0\n // while (q[i-ky]*(y[ky-1]*radix+y[ky-2]) > r[i]*radix*radix+r[i-1]*radix+r[i-2])\n // q[i-ky]--;\n for (;;) {\n y2 = (ky > 1 ? y[ky - 2] : 0) * q[i - ky]\n c = y2 >> bpe\n y2 = y2 & mask\n y1 = c + q[i - ky] * y[ky - 1]\n c = y1 >> bpe\n y1 = y1 & mask\n\n if (\n c == r[i]\n ? y1 == r[i - 1] ? y2 > (i > 1 ? r[i - 2] : 0) : y1 > r[i - 1]\n : c > r[i]\n )\n q[i - ky]--\n else break\n }\n\n linCombShift_(r, y, -q[i - ky], i - ky) //r=r-q[i-ky]*leftShift_(y,i-ky)\n if (negative(r)) {\n addShift_(r, y, i - ky) //r=r+leftShift_(y,i-ky)\n q[i - ky]--\n }\n }\n\n rightShift_(y, a) //undo the normalization step\n rightShift_(r, a) //undo the normalization step\n}\n\n/**\n * do carries and borrows so each element of the bigInt x fits in bpe bits.\n *\n * @param {number[]} x\n */\nexport function carry_(x: number[]): void {\n var i, k, c, b\n k = x.length\n c = 0\n for (i = 0; i < k; i++) {\n c += x[i]\n b = 0\n if (c < 0) {\n b = -(c >> bpe)\n c += b * radix\n }\n x[i] = c & mask\n c = (c >> bpe) - b\n }\n}\n\n/**\n * return x mod n for bigInt x and integer n.\n *\n * @export\n * @param {number[]} x\n * @param {number} n\n * @returns {number}\n */\nexport function modInt(x: number[], n: number): number {\n var i,\n c = 0\n for (i = x.length - 1; i >= 0; i--) c = (c * radix + x[i]) % n\n return c\n}\n\n/**\n * convert the integer t into a bigInt with at least the given number of bits.\n * the returned array stores the bigInt in bpe-bit chunks, little endian (buff[0] is least significant word)\n * Pad the array with leading zeros so that it has at least minSize elements.\n *\n * There will always be at least one leading 0 element.\n *\n * @export\n * @param {number} t\n * @param {number} bits\n * @param {number} minSize\n * @returns {number[]}\n */\nexport function int2bigInt(t: number, bits: number, minSize: number): number[] {\n var i, k\n k = Math.ceil(bits / bpe) + 1\n k = minSize > k ? minSize : k\n var buff = new Array(k)\n copyInt_(buff, t)\n return buff\n}\n\n/**\n * return the bigInt given a string representation in a given base.\n * Pad the array with leading zeros so that it has at least minSize elements.\n * If base=-1, then it reads in a space-separated list of array elements in decimal.\n *\n * The array will always have at least one leading zero, unless base=-1.\n *\n * @export\n * @param {string} s\n * @param {number} base\n * @param {number} [minSize]\n * @returns {number[]}\n */\nexport function str2bigInt(\n s: string,\n base: number,\n minSize?: number,\n): number[] {\n var d, i, x, y, kk\n var k = s.length\n if (base === -1) {\n //comma-separated list of array elements in decimal\n x = new Array(0)\n for (;;) {\n y = new Array(x.length + 1)\n for (i = 0; i < x.length; i++) y[i + 1] = x[i]\n y[0] = parseInt(s, 10) //TODO PERF Should we replace that with ~~ (not not)? https://jsperf.com/number-vs-parseint-vs-plus/7\n x = y\n d = s.indexOf(',', 0)\n if (d < 1) break\n //$off\n s = s.substring(d + 1)\n if (s.length == 0) break\n }\n //$off\n if (x.length < minSize) {\n //$off\n y = new Array(minSize)\n copy_(y, x)\n return y\n }\n return x\n }\n\n x = int2bigInt(0, base * k, 0)\n for (i = 0; i < k; i++) {\n d = digitsStr.indexOf(s.substring(i, i + 1), 0)\n if (base <= 36 && d >= 36)\n //convert lowercase to uppercase if base<=36\n d -= 26\n if (d >= base || d < 0) {\n //stop at first illegal character\n break\n }\n multInt_(x, base)\n addInt_(x, d)\n }\n\n for (k = x.length; k > 0 && !x[k - 1]; k--); //strip off leading zeros\n //$off\n k = minSize > k + 1 ? minSize : k + 1\n //$off\n y = new Array(k)\n //$off\n kk = k < x.length ? k : x.length\n //$off\n for (i = 0; i < kk; i++) y[i] = x[i]\n //$off\n for (; i < k; i++) y[i] = 0\n return y\n}\n\n//return the bigInt given a string representation in a given base.\n//Pad the array with leading zeros so that it has at least minSize elements.\n//If base=-1, then it reads in a space-separated list of array elements in decimal.\n//The array will always have at least one leading zero, unless base=-1.\n// function str2bigInt(s,b,minSize) {\n// var d, i, j, base, str, x, y, kk;\n// if (typeof b === 'string') {\n// base = b.length;\n// str = b;\n// } else {\n// base = b;\n// str = digitsStr;\n// }\n// var k=s.length;\n// if (base==-1) { //comma-separated list of array elements in decimal\n// x=new Array(0);\n// for (;;) {\n// y=new Array(x.length+1);\n// for (i=0;i<x.length;i++)\n// y[i+1]=x[i];\n// y[0]=parseInt(s,10);\n// x=y;\n// d=s.indexOf(',',0);\n// if (d<1)\n// break;\n// s=s.substring(d+1);\n// if (s.length==0)\n// break;\n// }\n// if (x.length<minSize) {\n// y=new Array(minSize);\n// copy_(y,x);\n// return y;\n// }\n// return x;\n// }\n\n// x=int2bigInt(0,base*k,0);\n// for (i=0;i<k;i++) {\n// d=str.indexOf(s.substring(i,i+1),0);\n// if (base<=36 && d>=36) { //convert lowercase to uppercase if base<=36\n// d-=26;\n// }\n// if (d>=base || d<0) { //ignore illegal characters\n// continue;\n// }\n// multInt_(x,base);\n// addInt_(x,d);\n// }\n\n// for (k=x.length;k>0 && !x[k-1];k--); //strip off leading zeros\n// k=minSize>k+1 ? minSize : k+1;\n// y=new Array(k);\n// kk=k<x.length ? k : x.length;\n// for (i=0;i<kk;i++)\n// y[i]=x[i];\n// for (;i<k;i++)\n// y[i]=0;\n// return y;\n// }\n\n/**\n * is bigint x equal to integer y?\n *\n * y must have less than bpe bits\n *\n * @export\n * @param {number[]} x\n * @param {number} y\n * @returns {(1 | 0)}\n */\nexport function equalsInt(x: number[], y: number): Bool {\n var i\n if (x[0] != y) return 0\n for (i = 1; i < x.length; i++) if (x[i]) return 0\n return 1\n}\n\n/**\n * are bigints x and y equal?\n *\n * this works even if x and y are different lengths and have arbitrarily many leading zeros\n *\n * @param {number[]} x\n * @param {number[]} y\n * @returns {(1 | 0)}\n */\nexport function equals(x: number[], y: number[]): Bool {\n var i\n var k = x.length < y.length ? x.length : y.length\n for (i = 0; i < k; i++) if (x[i] !== y[i]) return 0\n if (x.length > y.length) {\n for (; i < x.length; i++) if (x[i]) return 0\n } else {\n for (; i < y.length; i++) if (y[i]) return 0\n }\n return 1\n}\n\n/**\n * is the bigInt x equal to zero?\n *\n * @export\n * @param {number[]} x\n * @returns {(1 | 0)}\n */\nexport function isZero(x: number[]): Bool {\n var i\n for (i = 0; i < x.length; i++) if (x[i]) return 0\n return 1\n}\n\n/**\n * Convert a bigInt into a string in a given base, from base 2 up to base 95.\n *\n * Base -1 prints the contents of the array representing the number.\n *\n * @export\n * @param {number[]} x\n * @param {number} base\n * @returns {string}\n */\nexport function bigInt2str(x: number[], base: number): string {\n var i,\n t,\n s = ''\n\n if (s6.length !== x.length) s6 = dup(x)\n else copy_(s6, x)\n\n if (base === -1) {\n //return the list of array contents\n for (i = x.length - 1; i > 0; i--) s += x[i] + ','\n s += x[0]\n } else {\n //return it in the given base\n while (!isZero(s6)) {\n t = divInt_(s6, base) //t=s6 % base; s6=floor(s6/base);\n s = digitsStr.substring(t, t + 1) + s\n }\n }\n if (s.length === 0) s = '0'\n return s\n}\n\n/**\n * Convert a bigInt into bytes\n * @param x bigInt\n * @param littleEndian byte order by default\n */\nexport function bigInt2bytes(x: number[], littleEndian = true) {\n if(s6.length !== x.length) s6 = dup(x);\n else copy_(s6, x);\n\n const out: number[] = [];\n\n //console.log('bigInt2bytes');\n while(!isZero(s6)) {\n t = divInt_(s6, 256); //t=s6 % base; s6=floor(s6/base);\n out.push(t);\n //console.log('bigInt2bytes', t);\n }\n\n if(littleEndian) {\n out.reverse();\n }\n\n //console.log('bigInt2bytes', out);\n\n return out;\n}\n\n/**\n * Compare two bigInts and return -1 if x is less, 0 if equals, 1 if greater\n * @param x bigInt\n * @param y bigInt\n */\nexport function cmp(x: number[], y: number[]) {\n return greater(x, y) ? 1 : (equals(x, y) ? 0 : -1);\n}\n\n/* Object.assign(self, {\n cmp,\n str2bigInt,\n int2bigInt,\n bigInt2str,\n one,\n divide_,\n divInt_,\n dup,\n negative\n}); */\n\n/**\n * Returns a duplicate of bigInt x\n *\n * @export\n * @param {number[]} x\n * @returns {number[]}\n */\nexport function dup(x: number[]): number[] {\n var i\n buff = Array(x.length)\n copy_(buff, x)\n return buff\n}\n\n/**\n * do x=y on bigInts x and y.\n *\n * x must be an array at least as big as y (not counting the leading zeros in y).\n *\n * @export\n * @param {number[]} x\n * @param {number[]} y\n * @returns {void}\n */\nexport function copy_(x: number[], y: number[]): void {\n var i\n var k = x.length < y.length ? x.length : y.length\n for (i = 0; i < k; i++) x[i] = y[i]\n for (i = k; i < x.length; i++) x[i] = 0\n}\n\n/**\n * do x=y on bigInt x and integer y.\n *\n * @export\n * @param {number[]} x\n * @param {number} n\n * @returns {void}\n */\nexport function copyInt_(x: number[], n: number): void {\n var i, c\n var len = x.length //TODO .length in for loop have perfomance costs. Bench this\n for (c = n, i = 0; i < len; i++) {\n x[i] = c & mask\n c >>= bpe\n }\n}\n\n/**\n * do x=x+n where x is a bigInt and n is an integer.\n *\n * x must be large enough to hold the result.\n *\n * @export\n * @param {number[]} x\n * @param {number} n\n * @returns {void}\n */\nexport function addInt_(x: number[], n: number): void {\n var i, k, c, b\n x[0] += n\n k = x.length\n c = 0\n for (i = 0; i < k; i++) {\n c += x[i]\n b = 0\n if (c < 0) {\n b = -(c >> bpe)\n c += b * radix\n }\n x[i] = c & mask\n c = (c >> bpe) - b\n if (!c) return //stop carrying as soon as the carry is zero\n }\n}\n\n/**\n * right shift bigInt x by n bits.\n *\n * 0 <= n < bpe.\n *\n * @export\n * @param {number[]} x\n * @param {number} n\n */\nexport function rightShift_(x: number[], n: number): void {\n var i\n var k = Math.floor(n / bpe)\n if (k) {\n for (\n i = 0;\n i < x.length - k;\n i++ //right shift x by k elements\n )\n x[i] = x[i + k]\n for (; i < x.length; i++) x[i] = 0\n //$off\n n %= bpe\n }\n for (i = 0; i < x.length - 1; i++) {\n x[i] = mask & ((x[i + 1] << (bpe - n)) | (x[i] >> n))\n }\n x[i] >>= n\n}\n\n/**\n * do x=floor(|x|/2)*sgn(x) for bigInt x in 2's complement\n *\n * @param {number[]} x\n * @returns {void}\n */\nexport function halve_(x: number[]): void {\n var i\n for (i = 0; i < x.length - 1; i++) {\n x[i] = mask & ((x[i + 1] << (bpe - 1)) | (x[i] >> 1))\n }\n x[i] = (x[i] >> 1) | (x[i] & (radix >> 1)) //most significant bit stays the same\n}\n\n/**\n * left shift bigInt x by n bits\n *\n * @export\n * @param {number[]} x\n * @param {number} n\n * @returns {void}\n */\nexport function leftShift_(x: number[], n: number): void {\n var i\n var k = Math.floor(n / bpe)\n if (k) {\n for (\n i = x.length;\n i >= k;\n i-- //left shift x by k elements\n )\n x[i] = x[i - k]\n for (; i >= 0; i--) x[i] = 0\n //$off\n n %= bpe\n }\n if (!n) return\n for (i = x.length - 1; i > 0; i--) {\n x[i] = mask & ((x[i] << n) | (x[i - 1] >> (bpe - n)))\n }\n x[i] = mask & (x[i] << n)\n}\n\n/**\n * do x=x*n where x is a bigInt and n is an integer.\n *\n * x must be large enough to hold the result.\n *\n * @param {number[]} x\n * @param {number} n\n * @returns {void}\n */\nexport function multInt_(x: number[], n: number): void {\n var i, k, c, b\n if (!n) return\n k = x.length\n c = 0\n for (i = 0; i < k; i++) {\n c += x[i] * n\n b = 0\n if (c < 0) {\n b = -(c >> bpe)\n c += b * radix\n }\n x[i] = c & mask\n c = (c >> bpe) - b\n }\n}\n\n/**\n * do x=floor(x/n) for bigInt x and integer n, and return the remainder\n *\n * @param {number[]} x\n * @param {number} n\n * @returns {number} remainder\n */\nexport function divInt_(x: number[], n: number): number {\n var i,\n r = 0,\n s\n for (i = x.length - 1; i >= 0; i--) {\n s = r * radix + x[i]\n x[i] = Math.floor(s / n)\n r = s % n\n }\n return r\n}\n\n/**\n * do the linear combination x=a*x+b*y for bigInts x and y, and integers a and b.\n *\n * x must be large enough to hold the answer.\n *\n * @param {number[]} x\n * @param {number[]} y\n * @param {number} a\n * @param {number} b\n * @returns {void}\n */\nexport function linComb_(x: number[], y: number[], a: number, b: number): void {\n var i, c, k, kk\n k = x.length < y.length ? x.length : y.length\n kk = x.length\n for (c = 0, i = 0; i < k; i++) {\n c += a * x[i] + b * y[i]\n x[i] = c & mask\n c >>= bpe\n }\n for (i = k; i < kk; i++) {\n c += a * x[i]\n x[i] = c & mask\n c >>= bpe\n }\n}\n\n/**\n * do the linear combination x=a*x+b*(y<<(ys*bpe)) for bigInts x and y, and integers a, b and ys.\n *\n * x must be large enough to hold the answer.\n *\n * @param {number[]} x\n * @param {number[]} y\n * @param {number} b\n * @param {number} ys\n * @returns {void}\n */\nexport function linCombShift_(\n x: number[],\n y: number[],\n b: number,\n ys: number,\n): void {\n var i, c, k, kk\n k = x.length < ys + y.length ? x.length : ys + y.length\n kk = x.length\n for (c = 0, i = ys; i < k; i++) {\n c += x[i] + b * y[i - ys]\n x[i] = c & mask\n c >>= bpe\n }\n for (i = k; c && i < kk; i++) {\n c += x[i]\n x[i] = c & mask\n c >>= bpe\n }\n}\n\n/**\n * do x=x+(y<<(ys*bpe)) for bigInts x and y, and integer ys.\n *\n * x must be large enough to hold the answer.\n *\n * @export\n * @param {number[]} x\n * @param {number[]} y\n * @param {number} ys\n * @return {void}\n */\nexport function addShift_(x: number[], y: number[], ys: number): void {\n var i, c, k, kk\n k = x.length < ys + y.length ? x.length : ys + y.length\n kk = x.length\n for (c = 0, i = ys; i < k; i++) {\n c += x[i] + y[i - ys]\n x[i] = c & mask\n c >>= bpe\n }\n for (i = k; c && i < kk; i++) {\n c += x[i]\n x[i] = c & mask\n c >>= bpe\n }\n}\n\n/**\n * do x=x-(y<<(ys*bpe)) for bigInts x and y, and integer ys\n *\n * x must be large enough to hold the answer\n *\n * @param {number[]} x\n * @param {number[]} y\n * @param {number} ys\n * @return {void}\n */\nexport function subShift_(x: number[], y: number[], ys: number): void {\n var i, c, k, kk\n k = x.length < ys + y.length ? x.length : ys + y.length\n kk = x.length\n for (c = 0, i = ys; i < k; i++) {\n c += x[i] - y[i - ys]\n x[i] = c & mask\n c >>= bpe\n }\n for (i = k; c && i < kk; i++) {\n c += x[i]\n x[i] = c & mask\n c >>= bpe\n }\n}\n\n/**\n * do x=x-y for bigInts x and y\n *\n * x must be large enough to hold the answer\n *\n * negative answers will be 2s complement\n *\n * @export\n * @param {number[]} x\n * @param {number[]} y\n * @return {void}\n */\nexport function sub_(x: number[], y: number[]): void {\n var i, c, k, kk\n k = x.length < y.length ? x.length : y.length\n for (c = 0, i = 0; i < k; i++) {\n c += x[i] - y[i]\n x[i] = c & mask\n c >>= bpe\n }\n for (i = k; c && i < x.length; i++) {\n c += x[i]\n x[i] = c & mask\n c >>= bpe\n }\n}\n\n/**\n * do x=x+y for bigInts x and y\n *\n * x must be large enough to hold the answer\n *\n * @export\n * @param {number[]} x\n * @param {number[]} y\n * @return {void}\n */\nexport function add_(x: number[], y: number[]): void {\n var i, c, k, kk\n k = x.length < y.length ? x.length : y.length\n for (c = 0, i = 0; i < k; i++) {\n c += x[i] + y[i]\n x[i] = c & mask\n c >>= bpe\n }\n for (i = k; c && i < x.length; i++) {\n c += x[i]\n x[i] = c & mask\n c >>= bpe\n }\n}\n\n/**\n * do x=x*y for bigInts x and y.\n *\n * This is faster when y<x.\n *\n * @export\n * @param {number[]} x\n * @param {number[]} y\n * @return {void}\n */\nexport function mult_(x: number[], y: number[]): void {\n var i\n if (ss.length != 2 * x.length) ss = new Array(2 * x.length)\n copyInt_(ss, 0)\n for (i = 0; i < y.length; i++) if (y[i]) linCombShift_(ss, x, y[i], i) //ss=1*ss+y[i]*(x<<(i*bpe))\n copy_(x, ss)\n}\n\n/**\n * do x=x mod n for bigInts x and n\n *\n * @export\n * @param {number[]} x\n * @param {number[]} n\n * @return {void}\n */\nexport function mod_(x: number[], n: number[]): void {\n if (s4.length !== x.length) s4 = dup(x)\n else copy_(s4, x)\n if (s5.length !== x.length) s5 = dup(x)\n divide_(s4, n, s5, x) //x = remainder of s4 / n\n}\n\n/**\n * do x=x*y mod n for bigInts x,y,n.\n *\n * for greater speed, let y<x.\n *\n * @param {number[]} x\n * @param {number[]} y\n * @param {number[]} n\n * @return {void}\n */\nexport function multMod_(x: number[], y: number[], n: number[]): void {\n var i\n if (s0.length != 2 * x.length) s0 = new Array(2 * x.length)\n copyInt_(s0, 0)\n for (i = 0; i < y.length; i++) if (y[i]) linCombShift_(s0, x, y[i], i) //s0=1*s0+y[i]*(x<<(i*bpe))\n mod_(s0, n)\n copy_(x, s0)\n}\n\n/**\n * do x=x*x mod n for bigInts x,n.\n *\n * @export\n * @param {number[]} x\n * @param {number[]} n\n * @return {void}\n */\nexport function squareMod_(x: number[], n: number[]): void {\n var i, j, d, c, kx, kn, k\n for (kx = x.length; kx > 0 && !x[kx - 1]; kx--); //ignore leading zeros in x\n k = kx > n.length ? 2 * kx : 2 * n.length //k=# elements in the product, which is twice the elements in the larger of x and n\n if (s0.length != k) s0 = new Array(k)\n copyInt_(s0, 0)\n for (i = 0; i < kx; i++) {\n c = s0[2 * i] + x[i] * x[i]\n s0[2 * i] = c & mask\n c >>= bpe\n for (j = i + 1; j < kx; j++) {\n c = s0[i + j] + 2 * x[i] * x[j] + c\n s0[i + j] = c & mask\n c >>= bpe\n }\n s0[i + kx] = c\n }\n mod_(s0, n)\n copy_(x, s0)\n}\n\n/**\n * return x with exactly k leading zero elements\n *\n * @export\n * @param {number[]} x\n * @param {number} k\n * @returns {number[]}\n */\nexport function trim(x: number[], k: number): number[] {\n var i, y\n for (i = x.length; i > 0 && !x[i - 1]; i--);\n y = new Array(i + k)\n copy_(y, x)\n return y\n}\n\n/**\n * do `x=x**y mod n`, where x,y,n are bigInts and `**` is exponentiation. `0**0=1`.\n *\n * this is faster when n is odd.\n *\n * x usually needs to have as many elements as n.\n *\n * @param {number[]} x\n * @param {number[]} y\n * @param {number[]} n\n * @return {void}\n */\nexport function powMod_(x: number[], y: number[], n: number[]): void {\n var k1, k2, kn, np\n if (s7.length != n.length) s7 = dup(n)\n\n //for even modulus, use a simple square-and-multiply algorithm,\n //rather than using the more complex Montgomery algorithm.\n if ((n[0] & 1) == 0) {\n copy_(s7, x)\n copyInt_(x, 1)\n while (!equalsInt(y, 0)) {\n if (y[0] & 1) multMod_(x, s7, n)\n divInt_(y, 2)\n squareMod_(s7, n)\n }\n return\n }\n\n //calculate np from n for the Montgomery multiplications\n copyInt_(s7, 0)\n for (kn = n.length; kn > 0 && !n[kn - 1]; kn--);\n np = radix - inverseModInt(modInt(n, radix), radix)\n s7[kn] = 1\n multMod_(x, s7, n) // x = x * 2**(kn*bp) mod n\n\n if (s3.length != x.length) s3 = dup(x)\n else copy_(s3, x)\n //$off\n // @ts-ignore\n for (k1 = y.length - 1; (k1 > 0) & !y[k1]; k1--); //k1=first nonzero element of y\n if (y[k1] == 0) {\n //anything to the 0th power is 1\n copyInt_(x, 1)\n return\n }\n for (k2 = 1 << (bpe - 1); k2 && !(y[k1] & k2); k2 >>= 1); //k2=position of first 1 bit in y[k1]\n for (;;) {\n if (!(k2 >>= 1)) {\n //look at next bit of y\n k1--\n if (k1 < 0) {\n mont_(x, one, n, np)\n return\n }\n k2 = 1 << (bpe - 1)\n }\n mont_(x, x, n, np)\n\n if (k2 & y[k1])\n //if next bit is a 1\n mont_(x, s3, n, np)\n }\n}\n\n/**\n * do x=x*y*Ri mod n for bigInts x,y,n,\n * where Ri = 2**(-kn*bpe) mod n, and kn is the\n * number of elements in the n array, not\n * counting leading zeros.\n *\n * x array must have at least as many elemnts as the n array\n * It's OK if x and y are the same variable.\n *\n * must have:\n * * x,y < n\n * * n is odd\n * * np = -(n^(-1)) mod radix\n *\n * @export\n * @param {number[]} x\n * @param {number[]} y\n * @param {number[]} n\n * @param {number} np\n * @return {void}\n */\nexport function mont_(x: number[], y: number[], n: number[], np: number): void {\n var i, j, c, ui, t, ks\n var kn = n.length\n var ky = y.length\n\n if (sa.length != kn) sa = new Array(kn)\n\n copyInt_(sa, 0)\n\n for (; kn > 0 && n[kn - 1] == 0; kn--); //ignore leading zeros of n\n for (; ky > 0 && y[ky - 1] == 0; ky--); //ignore leading zeros of y\n ks = sa.length - 1 //sa will never have more than this many nonzero elements.\n\n //the following loop consumes 95% of the runtime for randTruePrime_() and powMod_() for large numbers\n for (i = 0; i < kn; i++) {\n t = sa[0] + x[i] * y[0]\n ui = ((t & mask) * np) & mask //the inner \"& mask\" was needed on Safari (but not MSIE) at one time\n c = (t + ui * n[0]) >> bpe\n t = x[i]\n\n //do sa=(sa+x[i]*y+ui*n)/b where b=2**bpe. Loop is unrolled 5-fold for speed\n j = 1\n for (; j < ky - 4; ) {\n c += sa[j] + ui * n[j] + t * y[j]\n sa[j - 1] = c & mask\n c >>= bpe\n j++\n c += sa[j] + ui * n[j] + t * y[j]\n sa[j - 1] = c & mask\n c >>= bpe\n j++\n c += sa[j] + ui * n[j] + t * y[j]\n sa[j - 1] = c & mask\n c >>= bpe\n j++\n c += sa[j] + ui * n[j] + t * y[j]\n sa[j - 1] = c & mask\n c >>= bpe\n j++\n c += sa[j] + ui * n[j] + t * y[j]\n sa[j - 1] = c & mask\n c >>= bpe\n j++\n }\n for (; j < ky; ) {\n c += sa[j] + ui * n[j] + t * y[j]\n sa[j - 1] = c & mask\n c >>= bpe\n j++\n }\n for (; j < kn - 4; ) {\n c += sa[j] + ui * n[j]\n sa[j - 1] = c & mask\n c >>= bpe\n j++\n c += sa[j] + ui * n[j]\n sa[j - 1] = c & mask\n c >>= bpe\n j++\n c += sa[j] + ui * n[j]\n sa[j - 1] = c & mask\n c >>= bpe\n j++\n c += sa[j] + ui * n[j]\n sa[j - 1] = c & mask\n c >>= bpe\n j++\n c += sa[j] + ui * n[j]\n sa[j - 1] = c & mask\n c >>= bpe\n j++\n }\n for (; j < kn; ) {\n c += sa[j] + ui * n[j]\n sa[j - 1] = c & mask\n c >>= bpe\n j++\n }\n for (; j < ks; ) {\n c += sa[j]\n sa[j - 1] = c & mask\n c >>= bpe\n j++\n }\n sa[j - 1] = c & mask\n }\n\n if (!greater(n, sa)) sub_(sa, n)\n copy_(x, sa)\n}","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { renderImageFromUrlPromise } from \"../../helpers/dom/renderImageFromUrl\";\nimport replaceContent from \"../../helpers/dom/replaceContent\";\nimport sequentialDom from \"../../helpers/sequentialDom\";\nimport { UserProfilePhoto, ChatPhoto, InputFileLocation } from \"../../layer\";\nimport { NULL_PEER_ID, REPLIES_PEER_ID } from \"../mtproto/mtproto_config\";\nimport RichTextProcessor from \"../richtextprocessor\";\nimport rootScope from \"../rootScope\";\nimport appDownloadManager from \"./appDownloadManager\";\nimport appPeersManager from \"./appPeersManager\";\nimport appPhotosManager from \"./appPhotosManager\";\nimport appUsersManager from \"./appUsersManager\";\n\ntype PeerPhotoSize = 'photo_small' | 'photo_big';\n\nexport class AppAvatarsManager {\n private savedAvatarURLs: {\n [peerId: PeerId]: {\n [size in PeerPhotoSize]?: string | Promise<string>\n }\n } = {};\n\n public isAvatarCached(peerId: PeerId) {\n return !!this.savedAvatarURLs[peerId];\n }\n \n public removeFromAvatarsCache(peerId: PeerId) {\n if(this.savedAvatarURLs[peerId]) {\n delete this.savedAvatarURLs[peerId];\n }\n }\n\n public loadAvatar(peerId: PeerId, photo: UserProfilePhoto.userProfilePhoto | ChatPhoto.chatPhoto, size: PeerPhotoSize) {\n const inputPeer = appPeersManager.getInputPeerById(peerId);\n\n let cached = false;\n let getAvatarPromise: Promise<string>;\n let saved = this.savedAvatarURLs[peerId];\n if(!saved || !saved[size]) {\n if(!saved) {\n saved = this.savedAvatarURLs[peerId] = {};\n }\n\n //console.warn('will invoke downloadSmallFile:', peerId);\n const peerPhotoFileLocation: InputFileLocation.inputPeerPhotoFileLocation = {\n _: 'inputPeerPhotoFileLocation', \n pFlags: {},\n peer: inputPeer, \n photo_id: photo.photo_id\n };\n\n if(size === 'photo_big') {\n peerPhotoFileLocation.pFlags.big = true;\n }\n\n const downloadOptions = {dcId: photo.dc_id, location: peerPhotoFileLocation};\n\n /* let str: string;\n const time = Date.now();\n if(peerId === 0) {\n str = `download avatar ${peerId}`;\n } */\n\n const promise = appDownloadManager.download(downloadOptions);\n getAvatarPromise = saved[size] = promise.then(blob => {\n return saved[size] = URL.createObjectURL(blob);\n\n /* if(str) {\n console.log(str, Date.now() / 1000, Date.now() - time);\n } */\n });\n } else if(typeof(saved[size]) !== 'string') {\n getAvatarPromise = saved[size] as Promise<any>;\n } else {\n getAvatarPromise = Promise.resolve(saved[size]);\n cached = true;\n }\n\n return {cached, loadPromise: getAvatarPromise};\n }\n\n public putAvatar(\n div: HTMLElement, \n peerId: PeerId, \n photo: UserProfilePhoto.userProfilePhoto | ChatPhoto.chatPhoto, \n size: PeerPhotoSize, \n img = new Image(), \n onlyThumb = false\n ) {\n let {cached, loadPromise} = this.loadAvatar(peerId, photo, size);\n\n img.classList.add('avatar-photo');\n\n let renderThumbPromise: Promise<void>;\n let callback: () => void;\n let thumbImage: HTMLImageElement;\n if(cached) {\n // смотри в misc.ts: renderImageFromUrl\n callback = () => {\n replaceContent(div, img);\n div.dataset.color = '';\n };\n } else {\n const animate = rootScope.settings.animationsEnabled;\n if(animate) {\n img.classList.add('fade-in');\n }\n\n if(size === 'photo_big') { // let's load small photo first\n const res = this.putAvatar(div, peerId, photo, 'photo_small');\n renderThumbPromise = res.loadPromise;\n thumbImage = res.thumbImage;\n } else if(photo.stripped_thumb) {\n thumbImage = new Image();\n div.classList.add('avatar-relative');\n thumbImage.classList.add('avatar-photo', 'avatar-photo-thumbnail');\n const url = appPhotosManager.getPreviewURLFromBytes(photo.stripped_thumb);\n renderThumbPromise = renderImageFromUrlPromise(thumbImage, url).then(() => {\n replaceContent(div, thumbImage);\n });\n }\n\n callback = () => {\n if(thumbImage) {\n div.append(img);\n } else {\n replaceContent(div, img);\n }\n\n setTimeout(() => {\n if(div.childElementCount) {\n sequentialDom.mutateElement(img, () => {\n div.dataset.color = '';\n \n if(animate) {\n img.classList.remove('fade-in');\n }\n\n if(thumbImage) {\n thumbImage.remove();\n }\n });\n }\n }, animate ? 200 : 0);\n };\n }\n\n const renderPromise = loadPromise\n .then((url) => renderImageFromUrlPromise(img, url/* , false */))\n .then(callback);\n\n return {\n cached, \n loadPromise: renderThumbPromise || renderPromise,\n thumbImage\n };\n }\n\n public s(div: HTMLElement, innerHTML: string, color: string, icon: string) {\n div.innerHTML = innerHTML;\n div.dataset.color = color;\n div.classList.remove('tgico-saved', 'tgico-deletedaccount', 'tgico-reply_filled');\n icon && div.classList.add(icon);\n }\n\n // peerId === peerId || title\n public putPhoto(div: HTMLElement, peerId: PeerId, isDialog = false, title = '', onlyThumb = false) {\n const myId = rootScope.myId;\n \n //console.log('loadDialogPhoto location:', location, inputPeer);\n if(peerId === myId && isDialog) {\n this.s(div, '', '', 'tgico-saved');\n return;\n }\n \n if(peerId !== NULL_PEER_ID && peerId.isUser()) {\n const user = appUsersManager.getUser(peerId);\n if(user && user.pFlags && user.pFlags.deleted) {\n this.s(div, '', appPeersManager.getPeerColorById(peerId), 'tgico-deletedaccount');\n return;\n }\n }\n \n const photo = appPeersManager.getPeerPhoto(peerId);\n const avatarAvailable = !!photo;\n const avatarRendered = !!div.firstElementChild && !(div.firstElementChild as HTMLElement).classList.contains('emoji');\n if(!avatarAvailable || !avatarRendered || !this.savedAvatarURLs[peerId]) {\n let color = '';\n if(peerId && (peerId !== myId || !isDialog)) {\n color = appPeersManager.getPeerColorById(peerId);\n }\n\n if(peerId === REPLIES_PEER_ID) {\n this.s(div, '', color, 'tgico-reply_filled');\n return;\n }\n\n let abbr: string;\n if(!title) {\n const peer = appPeersManager.getPeer(peerId);\n abbr = peer.initials ?? '';\n } else {\n abbr = RichTextProcessor.getAbbreviation(title);\n }\n\n this.s(div, abbr, color, '');\n //return Promise.resolve(true);\n }\n\n if(avatarAvailable/* && false */) {\n const size: PeerPhotoSize = 'photo_small';\n return this.putAvatar(div, peerId, photo, size, undefined, onlyThumb);\n }\n }\n}\n\nconst appAvatarsManager = new AppAvatarsManager();\nexport default appAvatarsManager;\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n// * will change .cleaned and new instance will be created\r\nexport const getMiddleware = () => {\r\n let cleanupObj = {cleaned: false};\r\n return {\r\n clean: () => {\r\n cleanupObj.cleaned = true;\r\n cleanupObj = {cleaned: false};\r\n },\r\n get: (additionalCallback?: () => boolean) => {\r\n const _cleanupObj = cleanupObj;\r\n return () => {\r\n return !_cleanupObj.cleaned && (!additionalCallback || additionalCallback());\r\n };\r\n }\r\n };\r\n};\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nenum GROUP_CALL_STATE {\n UNMUTED,\n MUTED,\n MUTED_BY_ADMIN,\n CONNECTING,\n CLOSED\n}\n\nexport default GROUP_CALL_STATE;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov <igor.beatle@gmail.com>\n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport { processSearchText, ProcessSearchTextOptions } from '../helpers/cleanSearchText';\n\nexport default class SearchIndex<SearchWhat> {\n private fullTexts: Map<SearchWhat, string> = new Map();\n\n // minChars can be 0 because it requires at least one word (one symbol) to be found\n constructor(private options?: ProcessSearchTextOptions, private minChars = 0) {\n }\n\n public indexObject(id: SearchWhat, searchText: string) {\n /* if(searchIndex.fullTexts.hasOwnProperty(id)) {\n return false;\n } */\n\n if(this.options && searchText.trim()) {\n searchText = processSearchText(searchText, this.options);\n }\n\n if(!searchText) {\n this.fullTexts.delete(id);\n return false;\n }\n\n this.fullTexts.set(id, searchText);\n \n /* const shortIndexes = searchIndex.shortIndexes;\n searchText.split(' ').forEach((searchWord) => {\n let len = Math.min(searchWord.length, 3),\n wordPart, i;\n for(i = 1; i <= len; i++) {\n wordPart = searchWord.substr(0, i);\n if(shortIndexes[wordPart] === undefined) {\n shortIndexes[wordPart] = [id];\n } else {\n shortIndexes[wordPart].push(id);\n }\n }\n }); */\n }\n\n public search(query: string) {\n const fullTexts = this.fullTexts;\n //const shortIndexes = searchIndex.shortIndexes;\n\n if(this.options) {\n query = processSearchText(query, this.options);\n }\n\n const newFoundObjs: Array<{fullText: string, fullTextLength: number, what: SearchWhat, foundChars: number}> = [];\n const queryWords = query.split(' ');\n const queryWordsLength = queryWords.length;\n fullTexts.forEach((fullText, what) => {\n let found = true;\n let foundChars = 0;\n for(let i = 0; i < queryWordsLength; ++i) { // * verify that all words are found\n const word = queryWords[i];\n const idx = fullText.indexOf(word);\n if(idx === -1 || (idx !== 0 && fullText[idx - 1] !== ' ')) { // * search only from word beginning\n found = false;\n break;\n }\n\n foundChars += word.length;\n }\n\n if(found) {\n foundChars += queryWordsLength - 1;\n const fullTextLength = fullText.length;\n if(this.minChars <= foundChars || fullTextLength <= foundChars) {\n newFoundObjs.push({fullText, fullTextLength, what, foundChars});\n }\n }\n });\n\n newFoundObjs.sort((a, b) => a.fullTextLength - b.fullTextLength || b.foundChars - a.foundChars);\n\n //newFoundObjs.sort((a, b) => a.fullText.localeCompare(b.fullText));\n const newFoundObjs2: Set<SearchWhat> = new Set(newFoundObjs.map(o => o.what));\n\n /* const queryWords = query.split(' ');\n let foundArr: number[];\n for(let i = 0; i < queryWords.length; i++) {\n const newFound = shortIndexes[queryWords[i].substr(0, 3)];\n if(!newFound) {\n foundArr = [];\n break;\n }\n \n if(foundArr === undefined || foundArr.length > newFound.length) {\n foundArr = newFound;\n }\n }\n\n for(let j = 0; j < foundArr.length; j++) {\n let found = true;\n let searchText = fullTexts[foundArr[j]];\n for(let i = 0; i < queryWords.length; i++) {\n if(searchText.indexOf(queryWords[i]) === -1) {\n found = false;\n break;\n }\n }\n\n if(found) {\n newFoundObjs[foundArr[j]] = true;\n }\n } */\n\n return newFoundObjs2;\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n// Thanks to https://stackoverflow.com/a/49349813\r\nimport { clamp } from \"../helpers/number\";\r\n\r\n/**\r\n * Attibute modifier to create middle ellipsis\r\n * When the attribute value is left blank the ellipsis will be in the middle\r\n * When positive the attribute value will be used as a percentage\r\n * When negative the attribute value will be used as character index counted from the end\r\n * @example\r\n * <div data-middle-ellipsis>A Javascript solution to middle ellipsis</div>\r\n * <div data-middle-ellipsis=\"20\">A Javascript solution to middle ellipsis</div>\r\n * <div data-middle-ellipsis=\"-3\">A Javascript solution to middle ellipsis</div>\r\n */\r\nconst ellipsis = '…';\r\nconst map: Map<HTMLElement, {\r\n text: string,\r\n textLength: number,\r\n from: number,\r\n multiplier: number,\r\n font: string,\r\n textWidth: number,\r\n elementWidth: number\r\n}> = new Map();\r\n\r\nconst testQueue: Set<HTMLElement> = new Set();\r\nexport const fontFamily = 'Roboto, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Oxygen-Sans, Ubuntu, Cantarell, \"Helvetica Neue\", sans-serif';\r\nconst fontSize = '16px';\r\nlet timeoutId: number;\r\n\r\nconst setTestQueue = () => {\r\n cancelAnimationFrame(timeoutId);\r\n timeoutId = window.requestAnimationFrame(testQueueElements);\r\n};\r\n\r\nconst testQueueElements = () => {\r\n testQueue.forEach(testElement);\r\n testQueue.clear();\r\n};\r\n\r\nwindow.addEventListener('resize', () => {\r\n for(const [key] of map) {\r\n testQueue.add(key);\r\n }\r\n \r\n setTestQueue();\r\n}, {capture: true, passive: true});\r\n\r\nconst testElement = (element: HTMLElement) => {\r\n //const perf = performance.now();\r\n // do not recalculate variables a second time\r\n let mapped = map.get(element);\r\n const firstTime = !mapped;\r\n\r\n let {text, textLength, from, multiplier, font, textWidth, elementWidth} = mapped || {};\r\n //console.log('[MEE] testElement got mapped', mapped);\r\n\r\n if(firstTime) {\r\n text = element.textContent;\r\n textLength = text.length;\r\n from = /* parseFloat(element.getAttribute(attributeName)) || */50;\r\n multiplier = from > 0 && from / 100;\r\n\r\n //const perf = performance.now();\r\n font = `${element.dataset.fontWeight || 400} ${fontSize} ${fontFamily}`;\r\n /* const computedStyle = window.getComputedStyle(elm, null);\r\n font = `${computedStyle.getPropertyValue('font-weight')} ${computedStyle.getPropertyValue('font-size')} ${computedStyle.getPropertyValue('font-family')}`; */\r\n //console.log('testMiddleEllipsis get computed style:', performance.now() - perf, font);\r\n\r\n textWidth = getTextWidth(text, font);\r\n //const perf = performance.now();\r\n elementWidth = element.getBoundingClientRect().width;\r\n //console.log('testMiddleEllipsis get offsetWidth:', performance.now() - perf, font);\r\n mapped = {text, textLength, from, multiplier, font, textWidth, elementWidth};\r\n map.set(element, mapped);\r\n\r\n //console.log('[MEE] testElement map set', element);\r\n }\r\n \r\n const newElementWidth = element.getBoundingClientRect().width;\r\n const widthChanged = firstTime || elementWidth !== newElementWidth;\r\n !firstTime && widthChanged && (mapped.elementWidth = elementWidth = newElementWidth);\r\n \r\n if(widthChanged) {\r\n if(textWidth > elementWidth) {\r\n element.setAttribute('title', text);\r\n let smallerText = text;\r\n let smallerWidth = elementWidth;\r\n while(smallerText.length > 3) {\r\n let smallerTextLength = smallerText.length;\r\n const half = multiplier &&\r\n clamp(multiplier * smallerTextLength << 0, 1, smallerTextLength - 2) ||\r\n Math.max(smallerTextLength + from - 1, 1);\r\n const half1 = smallerText.substr(0, half).replace(/\\s*$/,'');\r\n const half2 = smallerText.substr(half + 1).replace(/^\\s*/,'');\r\n smallerText = half1 + half2;\r\n smallerWidth = getTextWidth(smallerText + ellipsis, font);\r\n if(smallerWidth < elementWidth) {\r\n element.textContent = half1 + ellipsis + half2;\r\n break;\r\n }\r\n }\r\n\r\n // * set new width after cutting text\r\n mapped.elementWidth = element.getBoundingClientRect().width;\r\n //mapped.textWidth = smallerWidth;\r\n } else {\r\n element.removeAttribute('title');\r\n }\r\n }\r\n\r\n //console.log('testMiddleEllipsis for element:', elm, performance.now() - perf);\r\n};\r\n\r\nlet context: CanvasRenderingContext2D;\r\n/**\r\n * Get the text width\r\n * @param {string} text\r\n * @param {string} font\r\n */\r\nfunction getTextWidth(text: string, font: string) {\r\n //const perf = performance.now();\r\n if(!context) {\r\n const canvas = document.createElement('canvas');\r\n context = canvas.getContext('2d');\r\n context.font = font;\r\n }\r\n\r\n //context.font = font;\r\n const metrics = context.measureText(text);\r\n //console.log('getTextWidth perf:', performance.now() - perf);\r\n return metrics.width;\r\n //return Math.round(metrics.width);\r\n}\r\n\r\nexport class MiddleEllipsisElement extends HTMLElement {\r\n constructor() {\r\n super();\r\n }\r\n\r\n connectedCallback() {\r\n //console.log('[MEE]: connectedCallback before', map.has(this), testQueue.has(this), map.size, this.textContent, map);\r\n\r\n map.set(this, null);\r\n testQueue.add(this);\r\n setTestQueue();\r\n //testElement(this);\r\n\r\n //console.log('[MEE]: connectedCallback after', map.has(this), map.size, testQueue.has(this), testQueue.size);\r\n }\r\n\r\n disconnectedCallback() {\r\n const deleted = map.delete(this);\r\n //console.log('[MEE]: disconnectedCallback', deleted, map.has(this), map.size, this.textContent, map);\r\n }\r\n}\r\n\r\ncustomElements.define(\"middle-ellipsis-element\", MiddleEllipsisElement);\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov <igor.beatle@gmail.com>\r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport rootScope from \"../rootScope\";\r\nimport appPeersManager from \"./appPeersManager\";\r\nimport appMessagesManager from \"./appMessagesManager\";\r\nimport apiUpdatesManager from \"./apiUpdatesManager\";\r\nimport RichTextProcessor from \"../richtextprocessor\";\r\nimport serverTimeManager from \"../mtproto/serverTimeManager\";\r\nimport { MessageEntity, DraftMessage, MessagesSaveDraft } from \"../../layer\";\r\nimport apiManager from \"../mtproto/mtprotoworker\";\r\nimport { tsNow } from \"../../helpers/date\";\r\nimport { deepEqual } from \"../../helpers/object\";\r\nimport { isObject } from \"../mtproto/bin_utils\";\r\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\r\nimport stateStorage from \"../stateStorage\";\r\nimport appMessagesIdsManager from \"./appMessagesIdsManager\";\r\nimport assumeType from \"../../helpers/assumeType\";\r\n\r\nexport type MyDraftMessage = DraftMessage.draftMessage;\r\n\r\nexport class AppDraftsManager {\r\n private drafts: {[peerIdAndThreadId: string]: MyDraftMessage} = {};\r\n private getAllDraftPromise: Promise<void> = null;\r\n\r\n constructor() {\r\n stateStorage.get('drafts').then(drafts => {\r\n this.drafts = drafts || {};\r\n });\r\n\r\n rootScope.addMultipleEventsListeners({\r\n updateDraftMessage: (update) => {\r\n const peerID = appPeersManager.getPeerId(update.peer);\r\n this.saveDraft(peerID, update.threadId, update.draft, {notify: true});\r\n }\r\n });\r\n }\r\n\r\n private getKey(peerId: PeerId, threadId?: number) {\r\n return '' + peerId + (threadId ? '_' + threadId : '');\r\n }\r\n\r\n public getDraft(peerId: PeerId, threadId?: number) {\r\n return this.drafts[this.getKey(peerId, threadId)];\r\n }\r\n\r\n public addMissedDialogs() {\r\n return this.getAllDrafts().then(() => {\r\n for(const key in this.drafts) {\r\n if(key.indexOf('_') !== -1) { // exclude threads\r\n continue;\r\n }\r\n\r\n const peerId = key.toPeerId();\r\n const dialog = appMessagesManager.getDialogOnly(peerId);\r\n if(!dialog) {\r\n appMessagesManager.reloadConversation(peerId);\r\n /* const dialog = appMessagesManager.generateDialog(peerId);\r\n dialog.draft = this.drafts[key];\r\n appMessagesManager.saveConversation(dialog);\r\n appMessagesManager.newDialogsToHandle[peerId] = dialog;\r\n appMessagesManager.scheduleHandleNewDialogs(); */\r\n }\r\n }\r\n });\r\n }\r\n\r\n public getAllDrafts() {\r\n return this.getAllDraftPromise || (\r\n this.getAllDraftPromise = apiManager.invokeApi('messages.getAllDrafts')\r\n .then((updates) => {\r\n const p = apiUpdatesManager.updatesState.syncLoading || Promise.resolve();\r\n p.then(() => {\r\n apiUpdatesManager.processUpdateMessage(updates);\r\n });\r\n })\r\n );\r\n }\r\n\r\n public saveDraft(peerId: PeerId, threadId: number, apiDraft: DraftMessage, options: Partial<{\r\n notify: boolean,\r\n force: boolean\r\n }> = {}) {\r\n const draft = this.processApiDraft(apiDraft);\r\n\r\n const key = this.getKey(peerId, threadId);\r\n if(draft) {\r\n this.drafts[key] = draft;\r\n } else {\r\n delete this.drafts[key];\r\n }\r\n\r\n stateStorage.set({\r\n drafts: this.drafts\r\n });\r\n\r\n if(options.notify) {\r\n // console.warn(dT(), 'save draft', peerId, apiDraft, options)\r\n rootScope.dispatchEvent('draft_updated', {\r\n peerId,\r\n threadId,\r\n draft,\r\n force: options.force\r\n });\r\n }\r\n\r\n return draft;\r\n }\r\n\r\n public draftsAreEqual(draft1: DraftMessage, draft2: DraftMessage) {\r\n if(typeof(draft1) !== typeof(draft2)) {\r\n return false;\r\n }\r\n\r\n if(!isObject(draft1)) {\r\n return true;\r\n }\r\n\r\n if(draft1._ !== draft2._) {\r\n return false;\r\n }\r\n \r\n if(draft1._ === 'draftMessage' && draft2._ === draft1._) {\r\n if(draft1.reply_to_msg_id !== draft2.reply_to_msg_id) {\r\n return false;\r\n }\r\n \r\n if(!deepEqual(draft1.entities, draft2.entities)) {\r\n return false;\r\n }\r\n \r\n if(draft1.message !== draft2.message) {\r\n return false;\r\n }\r\n \r\n if(draft1.pFlags.no_webpage !== draft2.pFlags.no_webpage) {\r\n return false;\r\n }\r\n }\r\n\r\n return true;\r\n }\r\n\r\n public isEmptyDraft(draft: DraftMessage) {\r\n if(!draft || draft._ === 'draftMessageEmpty') {\r\n return true;\r\n }\r\n \r\n if(draft.reply_to_msg_id > 0) {\r\n return false;\r\n }\r\n \r\n if(!draft.message.length) {\r\n return true;\r\n }\r\n \r\n return false;\r\n }\r\n\r\n public processApiDraft(draft: DraftMessage): MyDraftMessage {\r\n if(!draft || draft._ !== 'draftMessage') {\r\n return undefined;\r\n }\r\n\r\n const myEntities = RichTextProcessor.parseEntities(draft.message);\r\n const apiEntities = draft.entities || [];\r\n const totalEntities = RichTextProcessor.mergeEntities(apiEntities.slice(), myEntities); // ! only in this order, otherwise bold and emoji formatting won't work\r\n\r\n draft.rMessage = RichTextProcessor.wrapDraftText(draft.message, {entities: totalEntities});\r\n //draft.rReply = appMessagesManager.getRichReplyText(draft);\r\n if(draft.reply_to_msg_id) {\r\n draft.reply_to_msg_id = appMessagesIdsManager.generateMessageId(draft.reply_to_msg_id);\r\n }\r\n\r\n return draft;\r\n }\r\n\r\n public async syncDraft(peerId: PeerId, threadId: number, localDraft?: DraftMessage, saveOnServer = true, force = false) {\r\n // console.warn(dT(), 'sync draft', peerID)\r\n const serverDraft = this.getDraft(peerId, threadId);\r\n if(this.draftsAreEqual(serverDraft, localDraft)) {\r\n // console.warn(dT(), 'equal drafts', localDraft, serverDraft)\r\n return true;\r\n }\r\n\r\n // console.warn(dT(), 'changed draft', localDraft, serverDraft)\r\n let params: MessagesSaveDraft = {\r\n peer: appPeersManager.getInputPeerById(peerId),\r\n message: ''\r\n };\r\n\r\n let draftObj: DraftMessage;\r\n if(this.isEmptyDraft(localDraft)) {\r\n draftObj = {_: 'draftMessageEmpty'};\r\n } else {\r\n assumeType<DraftMessage.draftMessage>(localDraft);\r\n let message = localDraft.message;\r\n let entities: MessageEntity[] = localDraft.entities;\r\n\r\n if(localDraft.reply_to_msg_id) {\r\n params.reply_to_msg_id = appMessagesIdsManager.getServerMessageId(localDraft.reply_to_msg_id);\r\n }\r\n\r\n if(entities?.length) {\r\n params.entities = appMessagesManager.getInputEntities(entities);\r\n }\r\n\r\n if(localDraft.pFlags.no_webpage) {\r\n params.no_webpage = localDraft.pFlags.no_webpage;\r\n }\r\n\r\n params.message = message;\r\n }\r\n\r\n const saveLocalDraft = draftObj || localDraft;\r\n saveLocalDraft.date = tsNow(true) + serverTimeManager.serverTimeOffset;\r\n\r\n this.saveDraft(peerId, threadId, saveLocalDraft, {notify: true, force});\r\n\r\n if(saveOnServer && !threadId) {\r\n return apiManager.invokeApi('messages.saveDraft', params);\r\n }\r\n\r\n return true;\r\n }\r\n\r\n public clearAllDrafts() {\r\n return apiManager.invokeApi('messages.clearAllDrafts').then(bool => {\r\n if(!bool) {\r\n return;\r\n }\r\n\r\n for(const combined in this.drafts) {\r\n const [peerId, threadId] = combined.split('_');\r\n rootScope.dispatchEvent('draft_updated', {\r\n peerId: peerId.toPeerId(),\r\n threadId: threadId ? +threadId : undefined,\r\n draft: undefined\r\n });\r\n }\r\n });\r\n }\r\n\r\n public clearDraft(peerId: PeerId, threadId: number) {\r\n const emptyDraft: DraftMessage.draftMessageEmpty = {\r\n _: 'draftMessageEmpty'\r\n };\r\n\r\n if(threadId) {\r\n this.syncDraft(peerId, threadId, emptyDraft as any, false, true);\r\n } else {\r\n this.saveDraft(peerId, threadId, emptyDraft, {notify: true, force: true}); \r\n }\r\n }\r\n\r\n public setDraft(peerId: PeerId, threadId: number, message: string, entities?: MessageEntity[]) {\r\n const draft: DraftMessage.draftMessage = {\r\n _: 'draftMessage',\r\n date: Date.now() / 1000 | 0,\r\n message,\r\n pFlags: {},\r\n entities\r\n };\r\n\r\n if(threadId) {\r\n this.syncDraft(peerId, threadId, draft, false, true);\r\n } else {\r\n this.saveDraft(peerId, threadId, draft, {notify: true, force: true}); \r\n }\r\n }\r\n}\r\n\r\nconst appDraftsManager = new AppDraftsManager();\r\nMOUNT_CLASS_TO.appDraftsManager = appDraftsManager;\r\nexport default appDraftsManager;\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nconst ASSETS_PATH = 'assets/audio/';\n\nexport default class AudioAssetPlayer<AssetName extends string> {\n private audio: HTMLAudioElement;\n private tempId: number;\n\n constructor(private assets: AssetName[]) {\n this.tempId = 0;\n }\n\n public playSound(name: AssetName, loop = false) {\n ++this.tempId;\n \n try {\n const audio = this.createAudio();\n audio.autoplay = true;\n audio.src = ASSETS_PATH + name;\n audio.loop = loop;\n audio.play();\n } catch(e) {\n console.error('playSound', name, e);\n }\n }\n\n public createAudio() {\n let {audio} = this;\n if(audio) {\n return audio;\n }\n\n audio = this.audio = new Audio();\n audio.play();\n return audio;\n }\n\n public stopSound() {\n this.audio?.pause();\n }\n\n public cancelDelayedPlay() {\n ++this.tempId;\n }\n\n public playSoundWithTimeout(name: AssetName, loop: boolean, timeout: number) {\n // timeout = 0;\n const tempId = ++this.tempId;\n setTimeout(() => {\n if(this.tempId !== tempId) {\n return;\n }\n\n this.playSound(name, loop);\n }, timeout);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/evgeny-nadymov/telegram-react\n * Copyright (C) 2018 Evgeny Nadymov\n * https://github.com/evgeny-nadymov/telegram-react/blob/master/LICENSE\n */\n\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\nimport AudioAssetPlayer from \"../../helpers/audioAssetPlayer\";\nimport { safeReplaceObject } from \"../../helpers/object\";\nimport { nextRandomUint } from \"../../helpers/random\";\nimport tsNow from \"../../helpers/tsNow\";\nimport { GroupCall, GroupCallParticipant, GroupCallParticipantVideo, GroupCallParticipantVideoSourceGroup, InputGroupCall, Peer, PhoneJoinGroupCall, PhoneJoinGroupCallPresentation, Update, Updates } from \"../../layer\";\nimport GroupCallInstance from \"../calls/groupCallInstance\";\nimport GROUP_CALL_STATE from \"../calls/groupCallState\";\nimport createMainStreamManager from \"../calls/helpers/createMainStreamManager\";\nimport { generateSsrc } from \"../calls/localConferenceDescription\";\nimport { WebRTCLineType } from \"../calls/sdpBuilder\";\nimport StreamManager from \"../calls/streamManager\";\nimport { Ssrc } from \"../calls/types\";\nimport { logger } from \"../logger\";\nimport apiManager from \"../mtproto/mtprotoworker\";\nimport { NULL_PEER_ID } from \"../mtproto/mtproto_config\";\nimport rootScope from \"../rootScope\";\nimport apiUpdatesManager from \"./apiUpdatesManager\";\nimport appChatsManager from \"./appChatsManager\";\nimport appPeersManager from \"./appPeersManager\";\nimport appUsersManager from \"./appUsersManager\";\n\nexport type GroupCallId = GroupCall['id'];\nexport type MyGroupCall = GroupCall | InputGroupCall;\n\nexport type GroupCallConnectionType = 'main' | 'presentation';\n\nexport type JoinGroupCallJsonPayload = {\n fingerprints: {\n fingerprint: string;\n setup: string;\n hash: string;\n }[];\n pwd: string;\n ssrc: number;\n 'ssrc-groups': GroupCallParticipantVideoSourceGroup.groupCallParticipantVideoSourceGroup[];\n ufrag: string;\n};\n\nconst GET_PARTICIPANTS_LIMIT = 100;\n\nlet IS_MUTED = true;\n\nexport type GroupCallOutputSource = 'main' | 'presentation' | number;\n\nexport type GroupCallAudioAssetName = \"group_call_connect.mp3\" | \"group_call_end.mp3\" | \"group_call_start.mp3\" | \"voip_onallowtalk.mp3\";\n\nexport class AppGroupCallsManager {\n private log: ReturnType<typeof logger>;\n \n private groupCalls: Map<GroupCallId, MyGroupCall>;\n private participants: Map<GroupCallId, Map<PeerId, GroupCallParticipant>>;\n private nextOffsets: Map<GroupCallId, string>;\n \n // private audioAsset: AudioAsset;\n \n private currentGroupCall: GroupCallInstance;\n private connectionAudio: HTMLAudioElement;\n private doNotDispatchParticipantUpdate: PeerId;\n private audioAsset: AudioAssetPlayer<GroupCallAudioAssetName>;\n\n constructor() {\n this.log = logger('GROUP-CALLS');\n \n this.groupCalls = new Map();\n this.participants = new Map();\n this.nextOffsets = new Map();\n \n rootScope.addMultipleEventsListeners({\n updateGroupCall: (update) => {\n this.saveGroupCall(update.call, update.chat_id);\n },\n \n updateGroupCallParticipants: (update) => {\n this.saveGroupCall(update.call);\n \n // this.getGroupCallFull(update.call.id, true); // ! WARNING TEMP\n\n const groupCallId = update.call.id;\n this.saveApiParticipants(groupCallId, update.participants);\n }\n });\n\n rootScope.addEventListener('group_call_update', (groupCall) => {\n if(groupCall._ === 'groupCallDiscarded') {\n const {currentGroupCall} = this;\n if(currentGroupCall?.id === groupCall.id) {\n currentGroupCall.hangUp(false, false, true);\n }\n\n this.participants.delete(groupCall.id);\n }\n });\n\n this.audioAsset = new AudioAssetPlayer<GroupCallAudioAssetName>([\n 'group_call_connect.mp3',\n 'group_call_end.mp3',\n 'group_call_start.mp3',\n 'voip_onallowtalk.mp3'\n ]);\n }\n\n get groupCall() {\n return this.currentGroupCall;\n }\n\n public getCachedParticipants(groupCallId: GroupCallId) {\n let participants = this.participants.get(groupCallId);\n if(!participants) {\n this.participants.set(groupCallId, participants = new Map());\n }\n\n return participants;\n }\n\n private prepareToSavingNextOffset(groupCallId: GroupCallId) {\n const nextOffsetsMap = this.nextOffsets;\n\n const setNextOffset = (newNextOffset: string) => {\n if(nextOffsetsMap.get(groupCallId) === nextOffset) {\n nextOffsetsMap.set(groupCallId, newNextOffset);\n }\n };\n\n const nextOffset = nextOffsetsMap.get(groupCallId);\n return {\n nextOffset,\n setNextOffset\n };\n }\n\n public saveApiParticipant(groupCallId: GroupCallId, participant: GroupCallParticipant, skipCounterUpdating?: boolean) {\n const {currentGroupCall} = this;\n const participants = this.getCachedParticipants(groupCallId);\n\n const peerId = appPeersManager.getPeerId(participant.peer);\n\n const oldParticipant = participants.get(peerId);\n const hasLeft = participant.pFlags.left;\n if(!oldParticipant && hasLeft) {\n return;\n }\n\n // * fix missing flag\n if(!participant.pFlags.muted && !participant.pFlags.can_self_unmute) {\n participant.pFlags.can_self_unmute = true;\n }\n\n const isCurrentGroupCall = currentGroupCall?.id === groupCallId;\n\n if(oldParticipant) {\n safeReplaceObject(oldParticipant, participant);\n participant = oldParticipant;\n } else {\n participants.set(peerId, participant);\n }\n\n if(isCurrentGroupCall) {\n currentGroupCall.onParticipantUpdate(participant, this.doNotDispatchParticipantUpdate);\n }\n\n // if(!skipCounterUpdating) {\n const groupCall = this.getGroupCall(groupCallId);\n if(groupCall?._ === 'groupCall') {\n let modified = false;\n if(hasLeft) {\n --groupCall.participants_count;\n modified = true;\n } else if(participant.pFlags.just_joined && !oldParticipant && !participant.pFlags.self) {\n ++groupCall.participants_count;\n modified = true;\n }\n \n if(modified) {\n rootScope.dispatchEvent('group_call_update', groupCall);\n }\n }\n // }\n \n if(hasLeft) {\n participants.delete(peerId);\n }\n\n if(oldParticipant && this.doNotDispatchParticipantUpdate !== peerId) {\n rootScope.dispatchEvent('group_call_participant', {\n groupCallId,\n participant\n });\n }\n }\n\n public saveApiParticipants(groupCallId: GroupCallId, apiParticipants: GroupCallParticipant[], skipCounterUpdating?: boolean) {\n if((apiParticipants as any).saved) return;\n (apiParticipants as any).saved = true;\n apiParticipants.forEach(p => this.saveApiParticipant(groupCallId, p, skipCounterUpdating));\n }\n\n public async editParticipant(groupCallId: GroupCallId, participant: GroupCallParticipant, options: Partial<{\n muted: boolean,\n volume: number,\n raiseHand: boolean,\n videoStopped: boolean,\n videoPaused: boolean,\n presentationPaused: boolean\n }>) {\n if(!Object.keys(options).length) {\n return;\n }\n\n let processUpdate = true;\n if(participant) {\n const {currentGroupCall} = this;\n const isCurrentCall = currentGroupCall?.id === groupCallId;\n const isUpdatingMeInCurrentCall = isCurrentCall && participant.pFlags.self;\n\n if(isUpdatingMeInCurrentCall) {\n if(options.muted !== undefined && !currentGroupCall.isSharingAudio) {\n delete options.muted;\n\n if(!Object.keys(options).length) {\n return;\n }\n }\n }\n\n // if(isCurrentCall) {\n const muted = options.muted;\n if(muted !== undefined) {\n /* const isAdmin = appChatsManager.hasRights(currentGroupCall.chatId, 'manage_call');\n if(isAdmin) {\n if(muted) {\n participant.pFlags.muted = true;\n delete participant.pFlags.can_self_unmute;\n } else {\n participant.pFlags.can_self_unmute = true;\n }\n } else */if(participant.pFlags.self) {\n if(muted) {\n participant.pFlags.muted = true;\n } else if(participant.pFlags.can_self_unmute) {\n delete participant.pFlags.muted;\n }\n }/* else {\n if(muted) {\n participant.pFlags.muted_by_you = true;\n } else {\n delete participant.pFlags.muted_by_you;\n }\n } */\n }\n // }\n\n /* const a: [keyof GroupCallParticipant['pFlags'], keyof typeof options][] = [\n ['muted', 'muted']\n ];\n\n a.forEach(([key, optionKey]) => {\n const value = options[optionKey];\n if(value === undefined) {\n return;\n }\n\n if(value) {\n participant.pFlags[key] = true;\n } else {\n delete participant.pFlags[key];\n }\n }); */\n\n if(options.raiseHand !== undefined) {\n if(options.raiseHand) participant.raise_hand_rating = '1';\n else delete participant.raise_hand_rating;\n }\n\n if(isUpdatingMeInCurrentCall) {\n if(options.videoStopped !== undefined) {\n if(options.videoStopped) delete participant.video;\n else participant.video = this.generateSelfVideo(currentGroupCall.connections.main.sources.video);\n }\n\n if(!participant.pFlags.muted && participant.pFlags.can_self_unmute) {\n currentGroupCall.setMuted(false);\n }\n\n currentGroupCall.dispatchEvent('state', currentGroupCall.state);\n }\n\n rootScope.dispatchEvent('group_call_participant', {groupCallId, participant});\n\n /* if(participant.pFlags.self) {\n processUpdate = false;\n } */\n }\n\n const peerId = participant.pFlags.self ? NULL_PEER_ID : appPeersManager.getPeerId(participant.peer);\n const updates = await apiManager.invokeApiSingle('phone.editGroupCallParticipant', {\n call: appGroupCallsManager.getGroupCallInput(groupCallId),\n participant: peerId === NULL_PEER_ID ? appPeersManager.getInputPeerSelf() : appPeersManager.getInputPeerById(peerId),\n muted: options.muted,\n volume: options.volume,\n raise_hand: options.raiseHand,\n video_paused: options.videoPaused,\n video_stopped: options.videoStopped,\n presentation_paused: options.presentationPaused\n });\n \n // do not replace with peerId because it can be null\n if(!processUpdate) this.doNotDispatchParticipantUpdate = appPeersManager.getPeerId(participant.peer);\n apiUpdatesManager.processUpdateMessage(updates);\n if(!processUpdate) this.doNotDispatchParticipantUpdate = undefined;\n }\n \n public getGroupCall(id: GroupCallId) {\n return this.groupCalls.get(id);\n }\n\n public async getGroupCallFull(id: GroupCallId, override?: boolean): Promise<GroupCall> {\n const call = this.getGroupCall(id);\n if(call && call._ !== 'inputGroupCall' && !override) {\n return call;\n }\n\n const limit = this.getCachedParticipants(id).size ? 0 : GET_PARTICIPANTS_LIMIT;\n return apiManager.invokeApiSingleProcess({\n method: 'phone.getGroupCall',\n params: {\n call: this.getGroupCallInput(id),\n limit\n },\n processResult: (groupCall) => {\n // ? maybe I should save group call after participants so I can avoid passing the 'skipCounterUpdating' flag ?\n appUsersManager.saveApiUsers(groupCall.users);\n appChatsManager.saveApiChats(groupCall.chats);\n this.saveApiParticipants(id, groupCall.participants, true);\n const call = this.saveGroupCall(groupCall.call) as GroupCall;\n\n if(limit && this.nextOffsets.get(id) === undefined) {\n this.nextOffsets.set(id, groupCall.participants_next_offset);\n }\n\n return call;\n }\n });\n }\n \n public saveGroupCall(call: MyGroupCall, chatId?: ChatId) {\n const oldCall = this.groupCalls.get(call.id);\n const shouldUpdate = call._ !== 'inputGroupCall' && (!oldCall || oldCall._ !== 'groupCallDiscarded');\n if(oldCall) {\n if(shouldUpdate) {\n safeReplaceObject(oldCall, call);\n }\n \n call = oldCall;\n } else {\n this.groupCalls.set(call.id, call);\n }\n\n if(shouldUpdate) {\n rootScope.dispatchEvent('group_call_update', call as any);\n }\n\n return call;\n }\n \n public startConnectingSound() {\n this.stopConnectingSound();\n this.audioAsset.playSoundWithTimeout('group_call_connect.mp3', true, 2500);\n }\n \n public stopConnectingSound() {\n this.audioAsset.stopSound();\n this.audioAsset.cancelDelayedPlay();\n }\n\n public setCurrentGroupCall(groupCall: GroupCallInstance) {\n this.currentGroupCall = groupCall;\n\n if(groupCall) {\n rootScope.dispatchEvent('group_call_instance', groupCall);\n }\n /* TdLibController.clientUpdate({\n '@type': 'clientUpdateGroupCall',\n call\n }); */\n }\n\n public async createGroupCall(chatId: ChatId, scheduleDate?: number, title?: string) {\n const updates = await apiManager.invokeApi('phone.createGroupCall', {\n peer: appPeersManager.getInputPeerById(chatId.toPeerId(true)),\n random_id: nextRandomUint(32),\n schedule_date: scheduleDate,\n title\n });\n\n apiUpdatesManager.processUpdateMessage(updates);\n\n const update = (updates as Updates.updates).updates.find(update => update._ === 'updateGroupCall') as Update.updateGroupCall;\n return update.call;\n }\n \n public async joinGroupCall(chatId: ChatId, groupCallId: GroupCallId, muted = IS_MUTED, rejoin?: boolean, joinVideo?: boolean) {\n this.audioAsset.createAudio();\n\n this.log(`joinGroupCall chatId=${chatId} id=${groupCallId} muted=${muted} rejoin=${rejoin}`);\n \n let streamManager: StreamManager;\n if(rejoin) {\n streamManager = this.currentGroupCall.connections.main.streamManager;\n } else {\n streamManager = await createMainStreamManager(muted, joinVideo);\n }\n\n return this.joinGroupCallInternal(chatId, groupCallId, streamManager, muted, rejoin, joinVideo);\n }\n\n public async joinGroupCallInternal(chatId: ChatId, groupCallId: GroupCallId, streamManager: StreamManager, muted: boolean, rejoin = false, joinVideo?: boolean) {\n const log = this.log.bindPrefix('joinGroupCallInternal');\n log('start', groupCallId);\n\n const type: GroupCallConnectionType = 'main';\n\n let {currentGroupCall} = this;\n if(currentGroupCall && rejoin) {\n // currentGroupCall.connections.main.connection = connection;\n currentGroupCall.handleUpdateGroupCallParticipants = false;\n currentGroupCall.updatingSdp = false;\n log('update currentGroupCall', groupCallId, currentGroupCall);\n } else {\n currentGroupCall = new GroupCallInstance({\n chatId,\n id: groupCallId\n });\n\n currentGroupCall.fixSafariAudio();\n\n currentGroupCall.addEventListener('state', (state) => {\n if(this.currentGroupCall === currentGroupCall && state === GROUP_CALL_STATE.CLOSED) {\n this.setCurrentGroupCall(null);\n this.stopConnectingSound();\n this.audioAsset.playSound('group_call_end.mp3');\n rootScope.dispatchEvent('chat_update', currentGroupCall.chatId);\n }\n });\n\n currentGroupCall.groupCall = await this.getGroupCallFull(groupCallId);\n\n const connectionInstance = currentGroupCall.createConnectionInstance({\n streamManager,\n type,\n options: {\n type,\n isMuted: muted,\n joinVideo,\n rejoin\n }\n });\n\n const connection = connectionInstance.createPeerConnection();\n connection.addEventListener('negotiationneeded', () => {\n connectionInstance.negotiate();\n });\n\n connection.addEventListener('track', (event) => {\n log('ontrack', event);\n currentGroupCall.onTrack(event);\n });\n \n connection.addEventListener('iceconnectionstatechange', () => {\n currentGroupCall.dispatchEvent('state', currentGroupCall.state);\n \n const {iceConnectionState} = connection;\n if(iceConnectionState === 'disconnected' || iceConnectionState === 'checking' || iceConnectionState === 'new') {\n this.startConnectingSound();\n } else {\n this.stopConnectingSound();\n }\n \n switch(iceConnectionState) {\n case 'checking': {\n break;\n }\n \n case 'closed': {\n currentGroupCall.hangUp();\n break;\n }\n \n case 'completed': {\n break;\n }\n \n case 'connected': {\n if(!currentGroupCall.joined) {\n currentGroupCall.joined = true;\n this.audioAsset.playSound('group_call_start.mp3');\n \n this.getGroupCallParticipants(groupCallId).then(({participants}) => {\n this.saveApiParticipants(groupCallId, [...participants.values()]);\n });\n }\n \n break;\n }\n \n case 'disconnected': {\n break;\n }\n \n case 'failed': {\n //TODO: replace with ICE restart\n currentGroupCall.hangUp();\n // connection.restartIce();\n break;\n }\n \n case 'new': {\n break;\n }\n }\n });\n\n connectionInstance.createDescription();\n connectionInstance.createDataChannel();\n\n connectionInstance.appendStreamToConference();\n\n this.setCurrentGroupCall(currentGroupCall);\n log('set currentGroupCall', groupCallId, currentGroupCall);\n\n this.startConnectingSound();\n\n return connectionInstance.negotiate();\n }\n }\n \n public getGroupCallInput(id: GroupCallId): InputGroupCall {\n const groupCall = this.getGroupCall(id);\n return {\n _: 'inputGroupCall',\n id: groupCall.id,\n access_hash: groupCall.access_hash\n };\n }\n\n public generateSelfVideo(source: Ssrc, audioSource?: number): GroupCallParticipantVideo {\n return source && {\n _: 'groupCallParticipantVideo',\n pFlags: {},\n endpoint: '',\n source_groups: source.sourceGroups,\n audio_source: audioSource\n };\n }\n \n public generateSelfParticipant(): GroupCallParticipant {\n const mainSources = this.currentGroupCall.connections.main.sources;\n const presentationSources = this.currentGroupCall.connections.presentation?.sources;\n return {\n _: 'groupCallParticipant',\n pFlags: {\n can_self_unmute: true,\n self: true\n },\n source: mainSources.audio.source,\n video: this.generateSelfVideo(mainSources.video),\n presentation: presentationSources && this.generateSelfVideo(presentationSources.video, presentationSources.audio?.source),\n date: tsNow(true),\n peer: appPeersManager.getOutputPeer(rootScope.myId)\n };\n }\n\n public makeSsrcsFromParticipant = (participant: GroupCallParticipant) => {\n return [\n this.makeSsrcFromParticipant(participant, 'audio', participant.source),\n participant.video?.audio_source && this.makeSsrcFromParticipant(participant, 'audio', participant.video.audio_source),\n participant.video && this.makeSsrcFromParticipant(participant, 'video', participant.video.source_groups, participant.video.endpoint),\n participant.presentation?.audio_source && this.makeSsrcFromParticipant(participant, 'audio', participant.presentation.audio_source),\n participant.presentation && this.makeSsrcFromParticipant(participant, 'video', participant.presentation.source_groups, participant.presentation.endpoint)\n ].filter(Boolean);\n };\n\n public makeSsrcFromParticipant(participant: GroupCallParticipant, type: WebRTCLineType, source?: number | GroupCallParticipantVideoSourceGroup[], endpoint?: string): Ssrc {\n return generateSsrc(type, source, endpoint);\n }\n\n public async getGroupCallParticipants(id: GroupCallId) {\n const {nextOffset, setNextOffset} = this.prepareToSavingNextOffset(id);\n\n if(nextOffset !== '') {\n await apiManager.invokeApiSingleProcess({\n method: 'phone.getGroupParticipants', \n params: {\n call: this.getGroupCallInput(id),\n ids: [],\n sources: [],\n offset: nextOffset || '',\n limit: GET_PARTICIPANTS_LIMIT\n },\n processResult: (groupCallParticipants) => {\n const newNextOffset = groupCallParticipants.count === groupCallParticipants.participants.length ? '' : groupCallParticipants.next_offset;\n \n appChatsManager.saveApiChats(groupCallParticipants.chats);\n appUsersManager.saveApiUsers(groupCallParticipants.users);\n this.saveApiParticipants(id, groupCallParticipants.participants);\n \n setNextOffset(newNextOffset);\n }\n });\n }\n\n return {\n participants: this.getCachedParticipants(id),\n isEnd: this.nextOffsets.get(id) === ''\n };\n }\n\n public async hangUp(groupCallId: GroupCallId, discard = false, rejoin = false) {\n this.log(`hangUp start id=${groupCallId} discard=${discard} rejoin=${rejoin}`);\n const {currentGroupCall} = this;\n if(currentGroupCall?.id !== groupCallId) return;\n\n currentGroupCall.hangUp(discard, rejoin);\n }\n\n public toggleMuted(muted?: boolean) {\n return this.changeUserMuted(NULL_PEER_ID, muted);\n }\n \n public changeUserMuted(peerId: PeerId, muted?: boolean) {\n const {currentGroupCall} = this;\n if(!currentGroupCall) return;\n\n const participant = currentGroupCall.getParticipantByPeerId(peerId);\n if(NULL_PEER_ID === peerId && participant.pFlags.can_self_unmute) {\n muted = muted === undefined ? !participant.pFlags.muted : muted;\n }\n\n return this.editParticipant(currentGroupCall.id, participant, {muted});\n }\n}\n\nconst appGroupCallsManager = new AppGroupCallsManager();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.appGroupCallsManager = appGroupCallsManager);\nexport default appGroupCallsManager;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { GROUP_CALL_AMPLITUDE_ANALYSE_INTERVAL_MS } from \"../constants\";\nimport StreamManager from \"../streamManager\";\nimport getAudioConstraints from \"./getAudioConstraints\";\nimport getStream from \"./getStream\";\nimport getVideoConstraints from \"./getVideoConstraints\";\n\nexport default async function createMainStreamManager(muted?: boolean, joinVideo?: boolean) {\n const constraints: MediaStreamConstraints = {\n audio: getAudioConstraints(),\n video: joinVideo && getVideoConstraints()\n };\n\n const streamManager = new StreamManager(GROUP_CALL_AMPLITUDE_ANALYSE_INTERVAL_MS);\n \n try {\n const stream = await getStream(constraints, muted);\n streamManager.addStream(stream, 'input');\n } catch(err) {\n console.error('joinGroupCall getStream error', err, constraints);\n streamManager.inputStream = new MediaStream();\n }\n\n return streamManager;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov <igor.beatle@gmail.com>\n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport Config from \"../lib/config\";\n\nconst badCharsRe = /[`~!@#$%^&*()\\-_=+\\[\\]\\\\|{}'\";:\\/?.>,<]+/g;\nconst trimRe = /^\\s+|\\s$/g;\n\nexport function clearBadCharsAndTrim(text: string) {\n return text.replace(badCharsRe, '').replace(trimRe, '');\n}\n\nexport function latinizeString(text: string) {\n return text.replace(/[^A-Za-z0-9]/g, (ch) => {\n const latinizeCh = Config.LatinizeMap[ch];\n return latinizeCh !== undefined ? latinizeCh : ch;\n });\n}\n\nexport default function cleanSearchText(text: string, latinize = true) {\n const hasTag = text.charAt(0) === '%';\n text = clearBadCharsAndTrim(text);\n if(latinize) text = latinizeString(text);\n \n text = text.toLowerCase();\n if(hasTag) text = '%' + text;\n\n return text;\n}\n\nexport type ProcessSearchTextOptions = Partial<{\n clearBadChars: boolean,\n latinize: boolean,\n ignoreCase: boolean,\n includeTag: boolean\n}>;\n\nexport function processSearchText(text: string, options: ProcessSearchTextOptions = {}) {\n const hasTag = options.includeTag && text.charAt(0) === '%';\n if(options.clearBadChars) text = clearBadCharsAndTrim(text);\n if(options.latinize) text = latinizeString(text);\n if(options.ignoreCase) text = text.toLowerCase();\n if(hasTag) text = '%' + text;\n return text;\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\n\r\n/**\r\n * Descend sorted storage\r\n */\r\n\r\ntype ItemType = number;\r\n\r\nexport enum SliceEnd {\r\n None = 0,\r\n Top = 1,\r\n Bottom = 2,\r\n Both = SliceEnd.Top | SliceEnd.Bottom\r\n};\r\n\r\nexport interface Slice extends Array<ItemType> {\r\n //slicedArray: SlicedArray;\r\n end: SliceEnd;\r\n\r\n isEnd: (side: SliceEnd) => boolean;\r\n setEnd: (side: SliceEnd) => void;\r\n unsetEnd: (side: SliceEnd) => void;\r\n\r\n slice: (from?: number, to?: number) => Slice;\r\n splice: (start: number, deleteCount: number, ...items: ItemType[]) => Slice;\r\n}\r\n\r\nexport interface SliceConstructor {\r\n new(...items: ItemType[]): Slice;\r\n}\r\n\r\nexport default class SlicedArray {\r\n private slices: Slice[]/* = [[7,6,5],[4,3,2],[1,0,-1]] */;\r\n private sliceConstructor: SliceConstructor;\r\n \r\n constructor() {\r\n // @ts-ignore\r\n this.sliceConstructor = SlicedArray.getSliceConstructor(this);\r\n\r\n const first = this.constructSlice();\r\n //first.setEnd(SliceEnd.Bottom);\r\n this.slices = [first];\r\n }\r\n\r\n private static getSliceConstructor(slicedArray: SlicedArray) {\r\n return class Slice extends Array<ItemType> implements Slice {\r\n //slicedArray: SlicedArray;\r\n end: SliceEnd = SliceEnd.None;\r\n \r\n /* constructor(...items: ItemType[]) {\r\n super(...items);\r\n //this.slicedArray = slicedArray;\r\n } */\r\n \r\n isEnd(side: SliceEnd): boolean {\r\n if((this.end & side) === side) {\r\n return true;\r\n }/* else if(!this.slicedArray) {\r\n return false;\r\n } */\r\n \r\n let isEnd = false;\r\n if(side === SliceEnd.Top) {\r\n const slice = slicedArray.last;\r\n isEnd = slice.end & side ? this.includes(slice[slice.length - 1])/* || !slice.length */ : false;\r\n } else if(side === SliceEnd.Bottom) {\r\n const slice = slicedArray.first;\r\n isEnd = slice.end & side ? this.includes(slice[0])/* || !slice.length */ : false;\r\n } else if(side === SliceEnd.Both) {\r\n return this.isEnd(SliceEnd.Top) && this.isEnd(SliceEnd.Bottom);\r\n }\r\n\r\n if(isEnd) {\r\n this.setEnd(side);\r\n }\r\n \r\n return isEnd;\r\n }\r\n \r\n setEnd(side: SliceEnd) {\r\n this.end |= side;\r\n }\r\n\r\n unsetEnd(side: SliceEnd) {\r\n this.end ^= side;\r\n }\r\n\r\n splice(start: number, deleteCount: number, ...items: ItemType[]) {\r\n const ret = super.splice(start, deleteCount, ...items);\r\n\r\n if(!this.length) {\r\n const slices = slicedArray.slices as number[][];\r\n const idx = slices.indexOf(this);\r\n if(idx !== -1) {\r\n if(slices.length === 1) { // left empty slice without ends\r\n this.unsetEnd(SliceEnd.Both);\r\n } else { // delete this slice\r\n slices.splice(idx, 1);\r\n }\r\n }\r\n }\r\n\r\n return ret;\r\n }\r\n }\r\n }\r\n\r\n public constructSlice(...items: ItemType[]) {\r\n //const slice = new Slice(this, ...items);\r\n // can't pass items directly to constructor because first argument is length\r\n const slice = new this.sliceConstructor(items.length);\r\n for(let i = 0, length = items.length; i < length; ++i) {\r\n slice[i] = items[i];\r\n }\r\n return slice;\r\n \r\n // ! code below will slow execution in 15 times\r\n /* const self = this;\r\n const p: Slice = new Proxy(slice, {\r\n get: function(target, name: any) {\r\n if(name === 'constructor') {\r\n const p = new Proxy(Slice, {\r\n construct: (target, args) => {\r\n return self.constructSlice(...args);\r\n }\r\n });\r\n\r\n return p;\r\n }\r\n\r\n return target[name];\r\n }\r\n });\r\n\r\n return p; */\r\n\r\n /*\r\n var p = slicedArray.constructSlice();\r\n p.length = 100000;\r\n p.fill(255);\r\n\r\n var a = new Array(100000);\r\n a.fill(255);\r\n\r\n var b = 0;\r\n var perf = performance.now();\r\n for(var i = 0; i < p.length; ++i) {\r\n b += p[i];\r\n }\r\n\r\n console.log('perf 1', performance.now() - perf);\r\n\r\n b = 0;\r\n perf = performance.now();\r\n for(var i = 0; i < a.length; ++i) {\r\n b += a[i];\r\n }\r\n\r\n console.log('perf 2', performance.now() - perf);\r\n */\r\n }\r\n\r\n public insertSlice(slice: ItemType[], flatten = true) {\r\n if(!slice.length) {\r\n return;\r\n }\r\n\r\n const first = this.slices[0];\r\n if(!first.length) {\r\n first.push(...slice);\r\n return first;\r\n }\r\n\r\n const lowerBound = slice[slice.length - 1];\r\n const upperBound = slice[0];\r\n\r\n let foundSlice: Slice, lowerIndex = -1, upperIndex = -1, foundSliceIndex = 0;\r\n for(; foundSliceIndex < this.slices.length; ++foundSliceIndex) {\r\n foundSlice = this.slices[foundSliceIndex];\r\n lowerIndex = foundSlice.indexOf(lowerBound);\r\n upperIndex = foundSlice.indexOf(upperBound);\r\n \r\n if(upperIndex !== -1 && -1 !== lowerIndex) {\r\n break;\r\n } else if(upperIndex !== -1 || -1 !== lowerIndex) {\r\n break;\r\n }\r\n }\r\n\r\n if(upperIndex !== -1 && -1 !== lowerIndex) {\r\n\r\n } else if(upperIndex !== -1) { // ([1, 2, 3] | [1, 2, 3, 4, 5]) -> [1, 2, 3, 4, 5]\r\n const sliced = slice.slice(foundSlice.length - upperIndex);\r\n foundSlice.push(...sliced);\r\n } else if(lowerIndex !== -1) { // ([1, 2, 3] | [-1, 0, 1]) -> [-1, 0, 1, 2, 3]\r\n const sliced = slice.slice(0, slice.length - lowerIndex - 1);\r\n foundSlice.unshift(...sliced);\r\n } else {\r\n let insertIndex = 0;\r\n for(const length = this.slices.length; insertIndex < length; ++insertIndex) { // * maybe should iterate from the end, could be faster ?\r\n const s = this.slices[insertIndex];\r\n if(slice[0] > s[0]) {\r\n break;\r\n }\r\n }\r\n\r\n this.slices.splice(insertIndex, 0, this.constructSlice(...slice));\r\n foundSliceIndex = insertIndex;\r\n }\r\n\r\n if(flatten) {\r\n return this.flatten(foundSliceIndex);\r\n }\r\n }\r\n\r\n private flatten(foundSliceIndex: number) {\r\n if(this.slices.length >= 2) {\r\n for(let i = 0, length = this.slices.length; i < (length - 1); ++i) {\r\n const prevSlice = this.slices[i];\r\n const nextSlice = this.slices[i + 1];\r\n \r\n const upperIndex = prevSlice.indexOf(nextSlice[0]);\r\n if(upperIndex !== -1) {\r\n prevSlice.setEnd(nextSlice.end);\r\n this.slices.splice(i + 1, 1);\r\n\r\n if(i < foundSliceIndex) {\r\n --foundSliceIndex;\r\n }\r\n\r\n --length; // respect array bounds\r\n --i; // repeat from the same place\r\n \r\n this.insertSlice(nextSlice, false);\r\n }\r\n }\r\n }\r\n\r\n return this.slices[foundSliceIndex];\r\n }\r\n\r\n // * \r\n \r\n get first() {\r\n return this.slices[0];\r\n }\r\n \r\n get last() {\r\n return this.slices[this.slices.length - 1];\r\n }\r\n\r\n get slice() {\r\n return this.first;\r\n }\r\n\r\n get length() {\r\n return this.slice.length;\r\n }\r\n\r\n public findSlice(item: ItemType) {\r\n for(let i = 0, length = this.slices.length; i < length; ++i) {\r\n const slice = this.slices[i];\r\n const index = slice.indexOf(item);\r\n if(index !== -1) {\r\n return {slice, index};\r\n }\r\n }\r\n \r\n return undefined;\r\n }\r\n\r\n public findSliceOffset(maxId: number) {\r\n let slice: Slice;\r\n for(let i = 0; i < this.slices.length; ++i) {\r\n let offset = 0;\r\n slice = this.slices[i];\r\n if(slice.length < 2) {\r\n continue;\r\n }\r\n \r\n for(; offset < slice.length; offset++) {\r\n if(maxId >= slice[offset]) {\r\n /* if(!offset) { // because can't find 3 in [[5,4], [2,1]]\r\n return undefined;\r\n } */\r\n\r\n return {\r\n slice, \r\n offset: maxId === slice[offset] ? offset : offset - 1\r\n };\r\n }\r\n }\r\n }\r\n\r\n if(slice && slice.isEnd(SliceEnd.Top)) {\r\n return {\r\n slice,\r\n offset: slice.length\r\n };\r\n }\r\n\r\n return undefined;\r\n }\r\n\r\n // * https://core.telegram.org/api/offsets\r\n public sliceMe(offsetId: number, add_offset: number, limit: number) {\r\n let slice = this.slice;\r\n let offset = 0;\r\n let sliceOffset = 0;\r\n\r\n if(offsetId) {\r\n const pos = this.findSliceOffset(offsetId);\r\n if(!pos) {\r\n return undefined;\r\n }\r\n\r\n slice = pos.slice;\r\n offset = sliceOffset = pos.offset;\r\n\r\n if(slice.includes(offsetId)) {\r\n sliceOffset += 1;\r\n }\r\n\r\n /* if(slice.includes(offsetId) && add_offset < 0) {\r\n add_offset += 1;\r\n } */\r\n }\r\n\r\n let sliceStart = Math.max(sliceOffset + add_offset, 0);\r\n let sliceEnd = sliceOffset + add_offset + limit;\r\n //const fixHalfBackLimit = add_offset && !(limit / add_offset % 2) && (sliceEnd % 2) ? 1 : 0;\r\n //sliceEnd += fixHalfBackLimit;\r\n\r\n const sliced = slice.slice(sliceStart, sliceEnd) as Slice;\r\n\r\n const topWasMeantToLoad = add_offset < 0 ? limit + add_offset : limit;\r\n const bottomWasMeantToLoad = Math.abs(add_offset);\r\n\r\n // can use 'slice' here to check because if it's end, then 'sliced' is out of 'slice'\r\n // useful when there is only 1 message in chat on its reopening\r\n const topFulfilled = (slice.length - sliceOffset) >= topWasMeantToLoad || (slice.isEnd(SliceEnd.Top) ? (sliced.setEnd(SliceEnd.Top), true) : false);\r\n const bottomFulfilled = (sliceOffset - bottomWasMeantToLoad) >= 0 || (slice.isEnd(SliceEnd.Bottom) ? (sliced.setEnd(SliceEnd.Bottom), true) : false);\r\n\r\n //console.log('sliceMe', topFulfilled, bottomFulfilled);\r\n\r\n return {\r\n slice: sliced, \r\n offsetIdOffset: offset,\r\n fulfilled: SliceEnd.None | (topFulfilled && bottomFulfilled ? SliceEnd.Both : ((topFulfilled ? SliceEnd.Top : SliceEnd.None) | (bottomFulfilled ? SliceEnd.Bottom : SliceEnd.None)))\r\n };\r\n }\r\n\r\n public unshift(...items: ItemType[]) {\r\n let slice = this.first;\r\n if(!slice.length) {\r\n slice.setEnd(SliceEnd.Bottom);\r\n } else if(!slice.isEnd(SliceEnd.Bottom)) {\r\n slice = this.constructSlice();\r\n slice.setEnd(SliceEnd.Bottom);\r\n this.slices.unshift(slice);\r\n }\r\n\r\n slice.unshift(...items);\r\n }\r\n\r\n public push(...items: ItemType[]) {\r\n let slice = this.last;\r\n if(!slice.length) {\r\n slice.setEnd(SliceEnd.Top);\r\n } else if(!slice.isEnd(SliceEnd.Top)) {\r\n slice = this.constructSlice();\r\n slice.setEnd(SliceEnd.Top);\r\n this.slices.push(slice);\r\n }\r\n\r\n slice.push(...items);\r\n }\r\n\r\n public delete(item: ItemType) {\r\n const found = this.findSlice(item);\r\n if(found) {\r\n found.slice.splice(found.index, 1);\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n}\r\n\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.SlicedArray = SlicedArray);\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\r\nimport { copy } from \"../../helpers/object\";\r\nimport { InputMedia, Message, MessageEntity, MessageMedia, Poll, PollResults } from \"../../layer\";\r\nimport { logger, LogTypes } from \"../logger\";\r\nimport apiManager from \"../mtproto/mtprotoworker\";\r\nimport { RichTextProcessor } from \"../richtextprocessor\";\r\nimport rootScope from \"../rootScope\";\r\nimport apiUpdatesManager from \"./apiUpdatesManager\";\r\nimport appMessagesIdsManager from \"./appMessagesIdsManager\";\r\nimport appMessagesManager from './appMessagesManager';\r\nimport appPeersManager from './appPeersManager';\r\nimport appUsersManager from \"./appUsersManager\";\r\n\r\nexport class AppPollsManager {\r\n public polls: {[id: string]: Poll} = {};\r\n public results: {[id: string]: PollResults} = {};\r\n public pollToMessages: {[id: string]: Set<string>} = {};\r\n\r\n private log = logger('POLLS', LogTypes.Error);\r\n\r\n constructor() {\r\n rootScope.addMultipleEventsListeners({\r\n updateMessagePoll: (update) => {\r\n this.log('updateMessagePoll:', update);\r\n\r\n let poll: Poll = update.poll || this.polls[update.poll_id];\r\n if(!poll) {\r\n return;\r\n }\r\n\r\n let results = update.results;\r\n const ret = this.savePoll(poll, results as any);\r\n poll = ret.poll;\r\n results = ret.results;\r\n \r\n rootScope.dispatchEvent('poll_update', {poll, results: results as any});\r\n }\r\n });\r\n }\r\n\r\n public savePoll(poll: Poll, results: PollResults, message?: Message.message) {\r\n if(message) {\r\n this.updatePollToMessage(message, true);\r\n }\r\n\r\n const id = poll.id;\r\n if(this.polls[id]) {\r\n poll = Object.assign(this.polls[id], poll);\r\n results = this.saveResults(poll, results);\r\n } else {\r\n this.polls[id] = poll;\r\n\r\n poll.rQuestion = RichTextProcessor.wrapEmojiText(poll.question);\r\n poll.rReply = RichTextProcessor.wrapEmojiText('📊') + ' ' + (poll.rQuestion || 'poll');\r\n poll.chosenIndexes = [];\r\n results = this.saveResults(poll, results);\r\n }\r\n\r\n return {poll, results};\r\n }\r\n\r\n public saveResults(poll: Poll, results: PollResults) {\r\n if(this.results[poll.id]) {\r\n results = Object.assign(this.results[poll.id], results);\r\n } else {\r\n this.results[poll.id] = results;\r\n }\r\n\r\n if(!results.pFlags.min) { // ! https://core.telegram.org/constructor/pollResults - min\r\n poll.chosenIndexes.length = 0;\r\n if(results?.results?.length) {\r\n results.results.forEach((answer, idx) => {\r\n if(answer.pFlags?.chosen) {\r\n poll.chosenIndexes.push(idx);\r\n }\r\n });\r\n }\r\n }\r\n\r\n return results;\r\n }\r\n\r\n public getPoll(pollId: string): {poll: Poll, results: PollResults} {\r\n return {\r\n poll: this.polls[pollId], \r\n results: this.results[pollId]\r\n };\r\n }\r\n\r\n public getInputMediaPoll(poll: Poll, correctAnswers?: Uint8Array[], solution?: string, solutionEntities?: MessageEntity[]): InputMedia.inputMediaPoll {\r\n if(solution) {\r\n if(!solutionEntities) {\r\n solutionEntities = [];\r\n }\r\n\r\n solution = RichTextProcessor.parseMarkdown(solution, solutionEntities);\r\n } else {\r\n solution = undefined; // can be string here\r\n }\r\n\r\n return {\r\n _: 'inputMediaPoll',\r\n poll,\r\n correct_answers: correctAnswers,\r\n solution,\r\n solution_entities: solution ? solutionEntities : undefined\r\n };\r\n }\r\n\r\n public updatePollToMessage(message: Message.message, add: boolean) {\r\n const {id} = (message.media as MessageMedia.messageMediaPoll).poll;\r\n let set = this.pollToMessages[id];\r\n \r\n if(!add && !set) {\r\n return;\r\n }\r\n\r\n if(!set) {\r\n set = this.pollToMessages[id] = new Set();\r\n }\r\n\r\n const key = message.peerId + '_' + message.mid;\r\n if(add) set.add(key);\r\n else set.delete(key);\r\n\r\n if(!add && !set.size) {\r\n delete this.polls[id];\r\n delete this.results[id];\r\n delete this.pollToMessages[id];\r\n }\r\n }\r\n\r\n public sendVote(message: any, optionIds: number[]): Promise<void> {\r\n const poll: Poll = message.media.poll;\r\n\r\n const options: Uint8Array[] = optionIds.map(index => {\r\n return poll.answers[index].option;\r\n });\r\n \r\n const messageId = message.mid;\r\n const peerId = message.peerId;\r\n const inputPeer = appPeersManager.getInputPeerById(peerId);\r\n\r\n if(message.pFlags.is_outgoing) {\r\n return appMessagesManager.invokeAfterMessageIsSent(messageId, 'sendVote', (message) => {\r\n this.log('invoke sendVote callback');\r\n return this.sendVote(message, optionIds);\r\n });\r\n }\r\n\r\n return apiManager.invokeApi('messages.sendVote', {\r\n peer: inputPeer,\r\n msg_id: appMessagesIdsManager.getServerMessageId(message.mid),\r\n options\r\n }).then(updates => {\r\n this.log('sendVote updates:', updates);\r\n apiUpdatesManager.processUpdateMessage(updates);\r\n });\r\n }\r\n\r\n public getResults(message: any) {\r\n const inputPeer = appPeersManager.getInputPeerById(message.peerId);\r\n\r\n return apiManager.invokeApi('messages.getPollResults', {\r\n peer: inputPeer,\r\n msg_id: appMessagesIdsManager.getServerMessageId(message.mid)\r\n }).then(updates => {\r\n apiUpdatesManager.processUpdateMessage(updates);\r\n this.log('getResults updates:', updates);\r\n });\r\n }\r\n\r\n public getVotes(message: any, option?: Uint8Array, offset?: string, limit = 20) {\r\n return apiManager.invokeApi('messages.getPollVotes', {\r\n peer: appPeersManager.getInputPeerById(message.peerId),\r\n id: appMessagesIdsManager.getServerMessageId(message.mid),\r\n option,\r\n offset,\r\n limit\r\n }).then((votesList) => {\r\n this.log('getPollVotes messages:', votesList);\r\n\r\n appUsersManager.saveApiUsers(votesList.users);\r\n\r\n return votesList;\r\n });\r\n }\r\n\r\n public stopPoll(message: any) {\r\n const poll: Poll = message.media.poll;\r\n \r\n if(poll.pFlags.closed) return Promise.resolve();\r\n\r\n const newPoll = copy(poll);\r\n newPoll.pFlags.closed = true;\r\n return appMessagesManager.editMessage(message, undefined, {\r\n newMedia: this.getInputMediaPoll(newPoll)\r\n }).then(() => {\r\n //console.log('stopped poll');\r\n }, err => {\r\n this.log.error('stopPoll error:', err);\r\n });\r\n }\r\n}\r\n\r\nconst appPollsManager = new AppPollsManager();\r\nMOUNT_CLASS_TO.appPollsManager = appPollsManager;\r\nexport default appPollsManager;\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/evgeny-nadymov/telegram-react\n * Copyright (C) 2018 Evgeny Nadymov\n * https://github.com/evgeny-nadymov/telegram-react/blob/master/LICENSE\n */\n\n/// NOTE: telegram returns sign source, while webrtc uses unsign source internally\n/// unsign => sign\nexport function toTelegramSource(source: number) {\n\treturn source << 0;\n}\n\n/// NOTE: telegram returns sign source, while webrtc uses unsign source internally\n/// sign => unsign\nexport function fromTelegramSource(source: number) {\n\treturn source >>> 0;\n}\n\nexport function getAmplitude(array: Uint8Array, scale = 3) {\n\tif(!array) return 0;\n\n\tconst {length} = array;\n\tlet total = 0;\n\tfor(let i = 0; i < length; ++i) {\n\t\ttotal += array[i] * array[i];\n\t}\n\tconst rms = Math.sqrt(total / length) / 255;\n\n\treturn Math.min(1, rms * scale);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/evgeny-nadymov/telegram-react\n * Copyright (C) 2018 Evgeny Nadymov\n * https://github.com/evgeny-nadymov/telegram-react/blob/master/LICENSE\n */\n\nimport { indexOfAndSplice } from '../../helpers/array';\nimport { safeAssign } from '../../helpers/object';\nimport { GroupCallParticipantVideoSourceGroup } from '../../layer';\nimport { SDPBuilder, WebRTCLineType, WEBRTC_MEDIA_PORT } from './sdpBuilder';\nimport { AudioCodec, GroupCallConnectionTransport, Ssrc, UpdateGroupCallConnectionData, VideoCodec } from './types';\n\nexport class ConferenceEntry {\n public source: number;\n public sourceGroups: GroupCallParticipantVideoSourceGroup[];\n public transceiver: RTCRtpTransceiver;\n public originalDirection: RTCRtpTransceiverDirection;\n public direction: RTCRtpTransceiverDirection;\n public port: string;\n public endpoint: string;\n public peerId: PeerId;\n \n public sendEntry: ConferenceEntry;\n public recvEntry: ConferenceEntry;\n\n constructor(public mid: string, public type: WebRTCLineType) {\n this.port = WEBRTC_MEDIA_PORT;\n }\n\n public setDirection(direction: RTCRtpTransceiverDirection) {\n if(!this.originalDirection) {\n this.originalDirection = direction;\n }\n\n return this.direction = direction;\n }\n\n public setPort(port: string) {\n return this.port = port;\n }\n\n public setEndpoint(endpoint: string) {\n return this.endpoint = endpoint;\n }\n\n public setPeerId(peerId: PeerId) {\n return this.peerId = peerId;\n }\n\n public createTransceiver(connection: RTCPeerConnection, init?: RTCRtpTransceiverInit) {\n if(init?.direction) {\n this.setDirection(init.direction);\n }\n\n return this.transceiver = connection.addTransceiver(this.type, init);\n }\n\n public setSource(source: number | GroupCallParticipantVideoSourceGroup[]) {\n let sourceGroups: GroupCallParticipantVideoSourceGroup[];\n if(Array.isArray(source)) {\n if(!source[0]) return;\n sourceGroups = source;\n source = sourceGroups[0].sources[0];\n }\n\n this.sourceGroups = sourceGroups;\n return this.source = source;\n }\n\n public shouldBeSkipped(isAnswer?: boolean) {\n return isAnswer && this.direction === 'inactive';\n }\n}\n\nexport function generateSsrc(type: WebRTCLineType, source: number | GroupCallParticipantVideoSourceGroup[], endpoint?: string): Ssrc {\n let sourceGroups: GroupCallParticipantVideoSourceGroup[];\n if(Array.isArray(source)) {\n if(!source[0]) return;\n sourceGroups = source;\n source = sourceGroups[0].sources[0];\n }\n \n return {\n endpoint,\n type,\n source,\n sourceGroups,\n };\n}\n\nexport default class LocalConferenceDescription implements UpdateGroupCallConnectionData {\n public readonly sessionId: string;\n // public ssrcs: Ssrc[];\n public readonly transport: GroupCallConnectionTransport;\n public readonly audio?: AudioCodec;\n public readonly video: VideoCodec;\n \n private maxSeenId: number;\n public readonly entries: ConferenceEntry[];\n private entriesByMid: Map<ConferenceEntry['mid'], ConferenceEntry>;\n private entriesBySource: Map<ConferenceEntry['source'], ConferenceEntry>;\n private entriesByPeerId: Map<ConferenceEntry['peerId'], Set<ConferenceEntry>>;\n \n constructor(public connection: RTCPeerConnection) {\n this.sessionId = '' + Date.now();\n // this.ssrcs = [];\n this.maxSeenId = -1;\n this.entries = [];\n this.entriesByMid = new Map();\n this.entriesBySource = new Map();\n this.entriesByPeerId = new Map();\n }\n\n public setData(data: UpdateGroupCallConnectionData) {\n return safeAssign(this, data);\n }\n\n public createEntry(type: WebRTCLineType) {\n const mid = '' + ++this.maxSeenId;\n const entry = new ConferenceEntry(mid, type);\n this.entries.push(entry);\n this.entriesByMid.set(mid, entry);\n return entry;\n }\n\n public deleteEntry(entry: ConferenceEntry) {\n indexOfAndSplice(this.entries, entry);\n this.entriesByMid.delete(entry.mid);\n this.entriesBySource.delete(entry.source);\n\n const set = this.entriesByPeerId.get(entry.peerId);\n if(set) {\n set.delete(entry);\n if(!set.size) {\n this.entriesByPeerId.delete(entry.peerId);\n }\n }\n }\n\n public setEntrySource(entry: ConferenceEntry, source: Parameters<ConferenceEntry['setSource']>[0]) {\n entry.setSource(source);\n this.entriesBySource.set(entry.source, entry);\n }\n\n public setEntryPeerId(entry: ConferenceEntry, peerId: ConferenceEntry['peerId']) {\n entry.setPeerId(peerId);\n let set = this.entriesByPeerId.get(peerId);\n if(!set) {\n this.entriesByPeerId.set(peerId, set = new Set());\n }\n\n set.add(entry);\n }\n \n public findEntry(verify: Parameters<LocalConferenceDescription['entries']['find']>[0]) {\n return this.entries.find(verify);\n }\n\n public findFreeSendRecvEntry(type: WebRTCLineType, isSending: boolean) {\n let entry = this.entries.find(entry => {\n return entry.direction === 'sendrecv' && entry.type === type && !(isSending ? entry.sendEntry : entry.recvEntry);\n });\n\n if(!entry) {\n entry = this.createEntry(type);\n entry.setDirection('sendrecv');\n }\n\n return entry;\n }\n \n public getEntryByMid(mid: ConferenceEntry['mid']) {\n return this.entriesByMid.get(mid);\n }\n\n public getEntryBySource(source: ConferenceEntry['source']) {\n return this.entriesBySource.get(source);\n }\n\n public getEntriesByPeerId(peerId: ConferenceEntry['peerId']) {\n return this.entriesByPeerId.get(peerId);\n }\n\n public generateSdp(options: Omit<Parameters<SDPBuilder['addConference']>[0], 'conference'>) {\n return SDPBuilder.fromConference({\n conference: this,\n ...options\n });\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { CancellablePromise, deferredPromise } from \"./cancellablePromise\";\r\nimport { getHeavyAnimationPromise } from \"../hooks/useHeavyAnimationCheck\";\r\nimport { fastRaf } from \"./schedulers\";\r\n\r\ntype HeavyQueue<T> = {\r\n items: any[], \r\n process: (...args: any[]) => T,\r\n context: any,\r\n promise?: CancellablePromise<ReturnType<HeavyQueue<T>['process']>[]>\r\n};\r\nconst heavyQueue: HeavyQueue<any>[] = [];\r\nlet processingQueue = false;\r\n\r\nexport default function addHeavyTask<T>(queue: HeavyQueue<T>, method: 'push' | 'unshift' = 'push') {\r\n if(!queue.items.length) {\r\n return Promise.resolve([]);\r\n }\r\n \r\n queue.promise = deferredPromise<T[]>();\r\n heavyQueue[method](queue);\r\n processHeavyQueue();\r\n\r\n return queue.promise;\r\n}\r\n\r\nfunction processHeavyQueue() {\r\n if(!processingQueue) {\r\n const queue = heavyQueue.shift();\r\n timedChunk(queue).finally(() => {\r\n processingQueue = false;\r\n if(heavyQueue.length) {\r\n processHeavyQueue();\r\n }\r\n });\r\n }\r\n}\r\n\r\nfunction timedChunk<T>(queue: HeavyQueue<T>) {\r\n if(!queue.items.length) {\r\n queue.promise.resolve([]);\r\n return Promise.resolve([]);\r\n }\r\n\r\n const todo = queue.items.slice();\r\n const results: T[] = [];\r\n\r\n return new Promise<T[]>((resolve, reject) => {\r\n const f = async() => {\r\n const start = performance.now();\r\n\r\n do {\r\n await getHeavyAnimationPromise();\r\n const possiblePromise = queue.process.apply(queue.context, todo.shift());\r\n let realResult: T;\r\n if(possiblePromise instanceof Promise) {\r\n try {\r\n realResult = await possiblePromise;\r\n } catch(err) {\r\n reject(err);\r\n return;\r\n }\r\n } else {\r\n realResult = possiblePromise;\r\n }\r\n\r\n results.push(realResult);\r\n } while(todo.length > 0 && (performance.now() - start) < 6);\r\n\r\n if(todo.length > 0) {\r\n fastRaf(f);\r\n //setTimeout(f, 25);\r\n } else {\r\n resolve(results);\r\n }\r\n };\r\n\r\n fastRaf(f);\r\n //setTimeout(f, 25);\r\n }).then(queue.promise.resolve, queue.promise.reject);\r\n}","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type fastBlur from '../vendor/fastBlur';\r\nimport addHeavyTask from './heavyQueue';\r\n\r\nconst RADIUS = 2;\r\nconst ITERATIONS = 2;\r\n\r\nconst isFilterAvailable = 'filter' in (document.createElement('canvas').getContext('2d') || {});\r\nlet requireBlurPromise: Promise<any>;\r\nlet fastBlurFunc: typeof fastBlur;\r\nif(!isFilterAvailable) {\r\n requireBlurPromise = import('../vendor/fastBlur').then(m => {\r\n fastBlurFunc = m.default;\r\n });\r\n} else {\r\n requireBlurPromise = Promise.resolve();\r\n}\r\n\r\nfunction processBlurNext(img: HTMLImageElement, radius: number, iterations: number) {\r\n return new Promise<string>((resolve) => {\r\n const canvas = document.createElement('canvas');\r\n canvas.width = img.width;\r\n canvas.height = img.height;\r\n \r\n const ctx = canvas.getContext('2d', {alpha: false});\r\n if(isFilterAvailable) {\r\n ctx.filter = `blur(${radius}px)`;\r\n ctx.drawImage(img, -radius * 2, -radius * 2, canvas.width + radius * 4, canvas.height + radius * 4);\r\n } else {\r\n ctx.drawImage(img, 0, 0);\r\n fastBlurFunc(ctx, 0, 0, canvas.width, canvas.height, radius, iterations);\r\n }\r\n \r\n resolve(canvas.toDataURL());\r\n /* if(DEBUG) {\r\n console.log(`[blur] end, radius: ${radius}, iterations: ${iterations}, time: ${performance.now() - perf}`);\r\n } */\r\n\r\n /* canvas.toBlob(blob => {\r\n resolve(URL.createObjectURL(blob));\r\n \r\n if(DEBUG) {\r\n console.log(`[blur] end, radius: ${radius}, iterations: ${iterations}, time: ${performance.now() - perf}`);\r\n }\r\n }); */\r\n });\r\n}\r\n\r\nconst blurPromises: Map<string, Promise<string>> = new Map();\r\nconst CACHE_SIZE = 1000;\r\n\r\nexport default function blur(dataUri: string, radius: number = RADIUS, iterations: number = ITERATIONS) {\r\n if(!dataUri) {\r\n console.error('no dataUri for blur', dataUri);\r\n return Promise.resolve(dataUri);\r\n }\r\n\r\n if(blurPromises.size > CACHE_SIZE) {\r\n blurPromises.clear();\r\n }\r\n \r\n if(blurPromises.has(dataUri)) return blurPromises.get(dataUri);\r\n const promise = new Promise<string>((resolve) => {\r\n //return resolve(dataUri);\r\n requireBlurPromise.then(() => {\r\n const img = new Image();\r\n img.onload = () => {\r\n if(isFilterAvailable) {\r\n processBlurNext(img, radius, iterations).then(resolve);\r\n } else {\r\n addHeavyTask({\r\n items: [[img, radius, iterations]],\r\n context: null,\r\n process: processBlurNext\r\n }, 'unshift').then(results => {\r\n resolve(results[0]);\r\n });\r\n }\r\n };\r\n img.src = dataUri;\r\n\r\n /* addHeavyTask({\r\n items: [[dataUri, radius, iterations]],\r\n context: null,\r\n process: processBlur\r\n }, 'unshift').then(results => {\r\n resolve(results[0]);\r\n }); */\r\n });\r\n });\r\n\r\n blurPromises.set(dataUri, promise);\r\n\r\n return promise;\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { RefreshReferenceTask, RefreshReferenceTaskResponse } from \"./apiFileManager\";\nimport appMessagesManager from \"../appManagers/appMessagesManager\";\nimport appStickersManager from \"../appManagers/appStickersManager\";\nimport { Photo } from \"../../layer\";\nimport { bytesToHex } from \"../../helpers/bytes\";\nimport { deepEqual } from \"../../helpers/object\";\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\nimport apiManager from \"./mtprotoworker\";\nimport assumeType from \"../../helpers/assumeType\";\nimport { logger } from \"../logger\";\n\nexport type ReferenceContext = ReferenceContext.referenceContextProfilePhoto | ReferenceContext.referenceContextMessage | ReferenceContext.referenceContextEmojiesSounds;\nexport namespace ReferenceContext {\n export type referenceContextProfilePhoto = {\n type: 'profilePhoto',\n peerId: PeerId\n };\n\n export type referenceContextMessage = {\n type: 'message',\n peerId: PeerId,\n messageId: number\n };\n\n export type referenceContextEmojiesSounds = {\n type: 'emojiesSounds'\n };\n}\n\nexport type ReferenceBytes = Photo.photo['file_reference'];\nexport type ReferenceContexts = Set<ReferenceContext>;\n\n//type ReferenceBytes = Uint8Array;\n\nclass ReferenceDatabase {\n private contexts: Map<ReferenceBytes, ReferenceContexts> = new Map();\n //private references: Map<ReferenceBytes, number[]> = new Map();\n private links: {[hex: string]: ReferenceBytes} = {};\n private log = logger('RD', undefined, true);\n private refreshEmojiesSoundsPromise: Promise<any>;\n\n constructor() {\n apiManager.addTaskListener('refreshReference', (task: RefreshReferenceTask) => {\n const originalPayload = task.payload;\n\n assumeType<RefreshReferenceTaskResponse>(task);\n task.originalPayload = originalPayload;\n\n this.refreshReference(originalPayload).then((bytes) => {\n task.payload = bytes;\n }, (err) => {\n task.error = err;\n }).then(() => apiManager.postMessage(task));\n });\n }\n\n public saveContext(reference: ReferenceBytes, context: ReferenceContext, contexts?: ReferenceContexts) {\n [contexts, reference] = this.getContexts(reference);\n if(!contexts) {\n contexts = new Set();\n this.contexts.set(reference, contexts);\n }\n \n this.links[bytesToHex(reference)] = reference;\n for(const _context of contexts) {\n if(deepEqual(_context, context)) {\n return;\n }\n }\n\n contexts.add(context);\n }\n\n public getReferenceByLink(reference: ReferenceBytes) {\n return this.links[bytesToHex(reference)];\n }\n\n public getContexts(reference: ReferenceBytes): [ReferenceContexts, ReferenceBytes] {\n const contexts = this.contexts.get(reference) || (reference = this.getReferenceByLink(reference) || reference, this.contexts.get(reference));\n return [contexts, reference];\n }\n\n public getContext(reference: ReferenceBytes): [ReferenceContext, ReferenceBytes] {\n const contexts = this.getContexts(reference);\n return contexts[0] ? [contexts[0].values().next().value, contexts[1]] : undefined;\n }\n\n public deleteContext(reference: ReferenceBytes, context: ReferenceContext, contexts?: ReferenceContexts) {\n [contexts, reference] = this.getContexts(reference);\n if(contexts) {\n for(const _context of contexts) {\n if(deepEqual(_context, context)) {\n contexts.delete(_context);\n if(!contexts.size) {\n this.contexts.delete(reference);\n delete this.links[bytesToHex(reference)];\n }\n return true;\n }\n }\n }\n\n return false;\n }\n\n public refreshReference(reference: ReferenceBytes, context?: ReferenceContext): Promise<Uint8Array | number[]> {\n this.log('refreshReference: start', reference.slice(), context);\n if(!context) {\n const c = this.getContext(reference);\n if(!c) {\n this.log('refreshReference: got no context for reference:', reference.slice());\n return Promise.reject('NO_CONTEXT');\n }\n\n [context, reference] = c;\n }\n\n let promise: Promise<any>;\n switch(context?.type) {\n case 'message': {\n promise = appMessagesManager.wrapSingleMessage(context.peerId, context.messageId, true);\n break; \n // .then(() => {\n // console.log('FILE_REFERENCE_EXPIRED: got message', context, appMessagesManager.getMessage((context as ReferenceContext.referenceContextMessage).messageId).media, reference);\n // });\n }\n\n case 'emojiesSounds': {\n promise = this.refreshEmojiesSoundsPromise || appStickersManager.getAnimatedEmojiSounds(true).then(() => {\n this.refreshEmojiesSoundsPromise = undefined;\n });\n break;\n }\n\n default: {\n this.log.warn('refreshReference: not implemented context', context);\n return Promise.reject();\n }\n }\n\n const hex = bytesToHex(reference);\n this.log('refreshReference: refreshing reference:', hex);\n return promise.then(() => {\n const newHex = bytesToHex(reference);\n this.log('refreshReference: refreshed, reference before:', hex, 'after:', newHex);\n if(hex !== newHex) {\n return reference;\n }\n\n this.deleteContext(reference, context);\n\n const newContext = this.getContext(reference);\n if(newContext) {\n return this.refreshReference(reference, newContext[0]);\n }\n\n this.log.error('refreshReference: no new context, reference before:', hex, 'after:', newHex, context);\n\n throw 'NO_NEW_CONTEXT';\n });\n }\n\n /* public replaceReference(oldReference: ReferenceBytes, newReference: ReferenceBytes) {\n const contexts = this.contexts.get(oldReference);\n if(contexts) {\n this.contexts.delete(oldReference);\n this.contexts.set(newReference, contexts);\n }\n } */\n}\n\nconst referenceDatabase = new ReferenceDatabase();\nMOUNT_CLASS_TO.referenceDatabase = referenceDatabase;\nexport default referenceDatabase;","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function htmlToDocumentFragment(html: string) {\r\n var template = document.createElement('template');\r\n html = html.trim(); // Never return a text node of whitespace as the result\r\n template.innerHTML = html;\r\n return template.content;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport enum ConnectionStatus {\r\n Connected,\r\n Connecting,\r\n Closed,\r\n TimedOut\r\n};\r\n\r\nexport type ConnectionStatusChange = {\r\n _: 'networkerStatus', \r\n status: ConnectionStatus,\r\n dcId: number,\r\n name: string,\r\n isFileNetworker: boolean,\r\n isFileDownload: boolean,\r\n isFileUpload: boolean,\r\n retryAt?: number\r\n};\r\n","export default async function getStream(constraints: MediaStreamConstraints, muted: boolean) {\n // console.log('getStream', constraints);\n \n\tconst stream = await navigator.mediaDevices.getUserMedia(constraints);\n\tstream.getTracks().forEach(x => {\n\t\t/* x.onmute = x => {\n\t\t\tconsole.log('track.onmute', x);\n\t\t};\n\t\tx.onunmute = x => {\n\t\t\tconsole.log('track.onunmute', x);\n\t\t}; */\n\n\t\tx.enabled = !muted;\n\t});\n\n\t// console.log('getStream result', stream);\n\treturn stream;\n}\n\n(window as any).getStream = getStream;\n","export default function getVideoConstraints(): MediaTrackConstraints {\n return {\n width: {min: 1280, max: 1920/* , ideal: 1920 */},\n height: {min: 720, max: 1080/* , ideal: 1080 */},\n frameRate: {min: 24, max: 30}\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/evgeny-nadymov/telegram-react\n * Copyright (C) 2018 Evgeny Nadymov\n * https://github.com/evgeny-nadymov/telegram-react/blob/master/LICENSE\n */\n\nimport { logger } from '../logger';\nimport rootScope from '../rootScope';\nimport { GROUP_CALL_AMPLITUDE_ANALYSE_COUNT_MAX } from './constants';\nimport stopTrack from './helpers/stopTrack';\nimport LocalConferenceDescription from './localConferenceDescription';\nimport { getAmplitude, toTelegramSource } from './utils';\n\nexport type StreamItemBase = {\n type: 'input' | 'output',\n track: MediaStreamTrack,\n source: string,\n stream: MediaStream\n};\n\nexport type StreamItem = StreamAudioItem | StreamVideoItem;\n\nexport type StreamAudioItem = StreamItemBase & {kind: 'audio', streamAnalyser: AudioStreamAnalyser};\nexport type StreamVideoItem = StreamItemBase & {kind: 'video'};\n\nexport type StreamAmplitude = {\n type: \"input\" | \"output\";\n source: string;\n stream: MediaStream;\n track: MediaStreamTrack;\n value: number;\n};\n\nclass AudioStreamAnalyser {\n public analyser: AnalyserNode;\n public gain: GainNode;\n public streamSource: MediaStreamAudioSourceNode;\n\n constructor(context: AudioContext, stream: MediaStream) {\n const streamSource = this.streamSource = context.createMediaStreamSource(stream);\n const analyser = this.analyser = context.createAnalyser();\n const gain = this.gain = context.createGain();\n // const streamDestination = context.createMediaStreamDestination();\n \n analyser.minDecibels = -100;\n analyser.maxDecibels = -30;\n analyser.smoothingTimeConstant = 0.05;\n analyser.fftSize = 1024;\n \n // connect Web Audio API\n streamSource.connect(analyser);\n // analyser.connect(context.destination);\n }\n}\n\nexport default class StreamManager {\n private context: AudioContext;\n public outputStream: MediaStream;\n public inputStream: MediaStream;\n\n private timer: number;\n private counter: number;\n\n private items: StreamItem[];\n\n private log: ReturnType<typeof logger>;\n\n public direction: RTCRtpTransceiver['direction'];\n public canCreateConferenceEntry: boolean;\n public lol: boolean;\n \n constructor(private interval?: number) {\n this.context = new (window.AudioContext || (window as any).webkitAudioContext)();\n this.items = [];\n this.outputStream = new MediaStream();\n this.inputStream = new MediaStream();\n this.counter = 0;\n this.log = logger('SM');\n this.direction = 'sendonly';\n this.canCreateConferenceEntry = true;\n // this.lol = true;\n }\n\n public addStream(stream: MediaStream, type: StreamItem['type']) {\n stream.getTracks().forEach(track => {\n this.addTrack(stream, track, type);\n });\n }\n\n public addTrack(stream: MediaStream, track: MediaStreamTrack, type: StreamItem['type']) {\n this.log('addTrack', type, track, stream);\n\n const {context, items, inputStream, outputStream} = this;\n const kind: StreamItem['kind'] = track.kind as any;\n const source = StreamManager.getSource(stream, type);\n \n // this.removeTrack(track);\n switch(type) {\n case 'input': {\n if(!inputStream) {\n this.inputStream = stream;\n } else {\n inputStream.addTrack(track);\n }\n\n break;\n }\n\n case 'output': {\n for(let i = 0; i < items.length; ++i) {\n const {track: t, type, source: itemSource} = items[i];\n if(itemSource === source && type === 'input') {\n items.splice(i, 1);\n outputStream.removeTrack(t);\n break;\n }\n }\n \n if(kind !== 'video') {\n outputStream.addTrack(track);\n }\n \n break;\n }\n }\n\n this.finalizeAddingTrack({\n type,\n source,\n stream,\n track,\n kind,\n streamAnalyser: kind === 'audio' ? new AudioStreamAnalyser(context, stream) : undefined\n });\n\n if(kind === 'audio' && this.interval) {\n this.changeTimer();\n }\n }\n\n private finalizeAddingTrack(item: StreamItem) {\n const {track} = item;\n track.addEventListener('ended', () => {\n this.removeTrack(track);\n }, {once: true});\n\n this.items.push(item);\n }\n\n public hasInputTrackKind(kind: StreamItem['kind']) {\n return this.items.find(item => item.type === 'input' && item.kind === kind);\n }\n\n public static getSource(stream: MediaStream, type: StreamItem['type']) {\n return type === 'input' ? (stream.source || stream.id) : '' + toTelegramSource(+stream.id.substring(6));\n }\n \n public removeTrack(track: MediaStreamTrack) {\n this.log('removeTrack', track);\n\n const {items} = this;\n \n let handled = false;\n for(let i = 0, length = items.length; !handled && i < length; ++i) {\n const {track: t, type} = items[i];\n switch(type) {\n case 'output': {\n if(t === track) {\n items.splice(i, 1);\n this.outputStream.removeTrack(track);\n handled = true;\n }\n\n break;\n }\n\n case 'input': {\n if(t === track) {\n items.splice(i, 1);\n this.inputStream.removeTrack(track);\n handled = true;\n }\n\n break;\n }\n }\n }\n \n if(track.kind === 'audio' && this.interval) {\n this.changeTimer();\n }\n }\n \n public replaceInputAudio(stream: MediaStream, oldTrack: MediaStreamTrack) {\n this.removeTrack(oldTrack);\n this.addStream(stream, 'input');\n }\n \n private changeTimer() {\n if(this.timer !== undefined) {\n clearInterval(this.timer);\n }\n \n if(this.items.length) {\n this.timer = window.setInterval(this.analyse, this.interval);\n }\n }\n \n public getAmplitude = (item: StreamAudioItem): StreamAmplitude => {\n const {streamAnalyser, stream, track, source, type} = item;\n const analyser = streamAnalyser.analyser;\n if(!analyser) return;\n \n const array = new Uint8Array(analyser.frequencyBinCount);\n analyser.getByteFrequencyData(array);\n const value = getAmplitude(array);\n \n return {\n type,\n source,\n stream,\n track,\n value\n };\n };\n \n public analyse = () => {\n const all = this.counter % 3 === 0;\n const filteredItems = all ? this.items : this.items.filter(x => x.type === 'input');\n const audioItems = filteredItems.filter(x => x.kind === 'audio') as StreamAudioItem[];\n const amplitudes = audioItems.slice(0, GROUP_CALL_AMPLITUDE_ANALYSE_COUNT_MAX).map(this.getAmplitude);\n if(++this.counter >= 1000) {\n this.counter = 0;\n }\n \n rootScope.dispatchEvent('group_call_amplitude', {\n amplitudes,\n type: all ? 'all' : 'input'\n });\n };\n\n /* public appendToConnection(connection: RTCPeerConnection) {\n if(this.inputStream) {\n this.inputStream.getTracks().forEach(track => {\n connection.log('addTrack', track);\n connection.addTrack(track, this.inputStream);\n\n if(track.kind === 'video') {\n track.enabled = true;\n }\n });\n }\n } */\n\n public appendToConference(conference: LocalConferenceDescription) {\n if(this.lol) {\n return;\n }\n // return;\n const {inputStream, direction, canCreateConferenceEntry} = this;\n // const direction: RTCRtpTransceiverInit['direction'] = 'sendrecv';\n // const direction: RTCRtpTransceiverInit['direction'] = 'sendonly';\n const transceiverInit: RTCRtpTransceiverInit = {direction, streams: [inputStream]};\n const types: ['audio' | 'video', RTCRtpTransceiverInit][] = [\n ['audio' as const, transceiverInit], \n ['video' as const, transceiverInit/* {sendEncodings: [{maxBitrate: 2500000}], ...transceiverInit} */]\n ];\n\n const tracks = inputStream.getTracks();\n // const transceivers = conference.connection.getTransceivers();\n for(const [type, transceiverInit] of types) {\n let entry = conference.findEntry(entry => entry.direction === direction && entry.type === type);\n if(!entry) {\n if(!canCreateConferenceEntry) {\n continue;\n }\n\n entry = conference.createEntry(type);\n }\n /* const entry = conference.findFreeSendRecvEntry(type, true);\n if(!entry.transceiver) {\n entry.transceiver = transceivers.find(transceiver => transceiver.mid === entry.mid);\n } */\n\n let {transceiver} = entry;\n if(!transceiver) {\n transceiver = entry.createTransceiver(conference.connection, transceiverInit);\n }\n\n if(entry.direction !== transceiver.direction) {\n transceiver.direction = entry.direction;\n }\n\n const track = tracks.find(track => track.kind === type);\n const sender = transceiver.sender;\n if(sender.track === track) {\n continue;\n }\n\n // try { // ! don't use await here. it will wait for adding track and fake one won't be visible in startNegotiation.\n /* await */sender.replaceTrack(track).catch(err => {\n this.log.error(err);\n });\n // } catch(err) {\n\n // }\n }\n }\n\n public stop() {\n try {\n const tracks = this.inputStream.getTracks().concat(this.outputStream.getTracks());\n tracks.forEach(track => {\n stopTrack(track);\n });\n } catch(e) {\n this.log.error(e);\n }\n }\n}\n","const IS_VIBRATE_SUPPORTED = !!navigator?.vibrate;\n\nexport default IS_VIBRATE_SUPPORTED;\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport { IS_SAFARI } from \"../environment/userAgent\";\r\nimport { logger, LogTypes } from \"./logger\";\r\n\r\ntype Result = {\r\n bytes: Uint8Array, \r\n waveform?: Uint8Array\r\n};\r\n\r\ntype Task = {\r\n pages: Uint8Array,\r\n withWaveform: boolean,\r\n waveform?: Uint8Array,\r\n callback: {resolve: (result: Result) => void, reject: (err: any) => void},\r\n timeout: number\r\n};\r\n\r\nexport class OpusDecodeController {\r\n private worker: Worker;\r\n private wavWorker : Worker;\r\n private sampleRate = 48000;\r\n private tasks: Array<Task> = [];\r\n private keepAlive = false;\r\n private isPlaySupportedResult: boolean;\r\n private log = logger('OPUS', LogTypes.Error);\r\n\r\n public isPlaySupported() {\r\n if(this.isPlaySupportedResult !== undefined) return this.isPlaySupportedResult;\r\n\r\n const audio = document.createElement('audio');\r\n return this.isPlaySupportedResult = !!(audio.canPlayType && audio.canPlayType('audio/ogg;').replace(/no/, ''))/* && false */;\r\n }\r\n\r\n public loadWavWorker() {\r\n if(this.wavWorker) return;\r\n\r\n this.wavWorker = new Worker('waveWorker.min.js');\r\n this.wavWorker.addEventListener('message', (e) => {\r\n const data = e.data;\r\n\r\n this.log('[WAV] got message:', data);\r\n if(data && data.page) {\r\n const bytes = data.page;\r\n this.onTaskEnd(this.tasks.shift(), bytes);\r\n }\r\n });\r\n }\r\n\r\n public loadWorker() {\r\n if(this.worker) return;\r\n\r\n this.worker = new Worker('decoderWorker.min.js');\r\n this.worker.addEventListener('message', (e) => {\r\n const data = e.data;\r\n \r\n this.log('[DECODER] got message', data);\r\n if(data.type === 'done') {\r\n //this.log('[DECODER] send done to wav');\r\n this.wavWorker.postMessage({command: 'done'});\r\n\r\n if(data.waveform) {\r\n this.tasks[0].waveform = data.waveform;\r\n }\r\n } else { // e.data contains decoded buffers as float32 values\r\n //this.log('[DECODER] send encode to wav');\r\n this.wavWorker.postMessage({\r\n command: 'encode',\r\n buffers: e.data\r\n }, IS_SAFARI ? undefined : data.map((typedArray: Uint8Array) => typedArray.buffer));\r\n }\r\n });\r\n }\r\n\r\n public setKeepAlive(keepAlive: boolean) {\r\n this.keepAlive = keepAlive;\r\n if(this.keepAlive) {\r\n this.loadWorker();\r\n this.loadWavWorker();\r\n } else if(!this.tasks.length) {\r\n this.terminateWorkers();\r\n }\r\n }\r\n\r\n public onTaskEnd(task: Task, result?: Uint8Array) {\r\n if(!result) {\r\n task.callback.reject('timeout');\r\n } else {\r\n clearTimeout(task.timeout);\r\n task.callback.resolve({bytes: result, waveform: task.waveform});\r\n }\r\n\r\n if(this.tasks.length) {\r\n this.executeNewTask(this.tasks[0]);\r\n }\r\n\r\n this.terminateWorkers();\r\n }\r\n\r\n public terminateWorkers(kill = false) {\r\n if((this.keepAlive || this.tasks.length) && !kill) return;\r\n\r\n if(this.worker) {\r\n this.worker.terminate();\r\n this.worker = null;\r\n }\r\n \r\n if(this.wavWorker) {\r\n this.wavWorker.terminate();\r\n this.wavWorker = null;\r\n }\r\n }\r\n\r\n public executeNewTask(task: Task) {\r\n this.worker.postMessage({ \r\n command: 'init',\r\n decoderSampleRate: this.sampleRate,\r\n outputBufferSampleRate: this.sampleRate\r\n });\r\n\r\n this.wavWorker.postMessage({ \r\n command: 'init',\r\n wavBitDepth: 16,\r\n wavSampleRate: this.sampleRate\r\n });\r\n\r\n //console.log('sending command to worker:', task);\r\n //setTimeout(() => {\r\n this.log('[DECODER] send decode');\r\n this.worker.postMessage({\r\n command: 'decode',\r\n pages: task.pages,\r\n waveform: task.withWaveform\r\n }, IS_SAFARI ? undefined : [task.pages.buffer]);\r\n //}, 1e3);\r\n\r\n task.timeout = window.setTimeout(() => {\r\n this.log.error('decode timeout'/* , task */);\r\n\r\n this.terminateWorkers(true);\r\n if(this.tasks.length) {\r\n this.loadWorker();\r\n this.loadWavWorker();\r\n }\r\n\r\n this.onTaskEnd(this.tasks.shift());\r\n }, 10e3);\r\n }\r\n\r\n public pushDecodeTask(pages: Uint8Array, withWaveform: boolean) {\r\n return new Promise<Result>((resolve, reject) => {\r\n const task = {\r\n pages,\r\n withWaveform,\r\n callback: {resolve, reject},\r\n timeout: 0\r\n };\r\n\r\n this.loadWorker();\r\n this.loadWavWorker();\r\n\r\n if(this.tasks.push(task) === 1) {\r\n this.executeNewTask(task);\r\n }\r\n });\r\n }\r\n\r\n public async decode(typedArray: Uint8Array, withWaveform = false) {\r\n return this.pushDecodeTask(typedArray, withWaveform).then(result => {\r\n const dataBlob = new Blob([result.bytes], {type: \"audio/wav\"});\r\n return {url: URL.createObjectURL(dataBlob), waveform: result.waveform};\r\n });\r\n }\r\n}\r\n\r\nconst opusDecodeController = new OpusDecodeController();\r\nMOUNT_CLASS_TO.opusDecodeController = opusDecodeController;\r\nexport default opusDecodeController;","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov <igor.beatle@gmail.com>\r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport appPhotosManager from \"./appPhotosManager\";\r\nimport appDocsManager from \"./appDocsManager\";\r\nimport { RichTextProcessor } from \"../richtextprocessor\";\r\nimport { ReferenceContext } from \"../mtproto/referenceDatabase\";\r\nimport rootScope from \"../rootScope\";\r\nimport { safeReplaceObject } from \"../../helpers/object\";\r\nimport { limitSymbols } from \"../../helpers/string\";\r\nimport { WebPage } from \"../../layer\";\r\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\r\n\r\nconst photoTypeSet = new Set(['photo', 'video', 'gif', 'document']);\r\n\r\ntype WebPageMessageKey = `${PeerId}_${number}`;\r\n\r\nexport class AppWebPagesManager {\r\n private webpages: {\r\n [webPageId: string]: WebPage\r\n } = {};\r\n private pendingWebPages: {\r\n [webPageId: string]: Set<WebPageMessageKey>\r\n } = {};\r\n \r\n constructor() {\r\n rootScope.addMultipleEventsListeners({\r\n updateWebPage: (update) => {\r\n this.saveWebPage(update.webpage);\r\n }\r\n });\r\n }\r\n \r\n public saveWebPage(apiWebPage: WebPage, messageKey?: WebPageMessageKey, mediaContext?: ReferenceContext) {\r\n if(apiWebPage._ === 'webPageNotModified') return;\r\n const {id} = apiWebPage;\r\n\r\n const oldWebPage = this.webpages[id];\r\n const isUpdated = oldWebPage && \r\n oldWebPage._ === apiWebPage._ && \r\n (oldWebPage as WebPage.webPage).hash === (oldWebPage as WebPage.webPage).hash;\r\n\r\n if(apiWebPage._ === 'webPage') {\r\n if(apiWebPage.photo?._ === 'photo') {\r\n apiWebPage.photo = appPhotosManager.savePhoto(apiWebPage.photo, mediaContext);\r\n } else {\r\n delete apiWebPage.photo;\r\n }\r\n \r\n if(apiWebPage.document?._ === 'document') {\r\n apiWebPage.document = appDocsManager.saveDoc(apiWebPage.document, mediaContext);\r\n } else {\r\n if(apiWebPage.type === 'document') {\r\n delete apiWebPage.type;\r\n }\r\n \r\n delete apiWebPage.document;\r\n }\r\n\r\n const siteName = apiWebPage.site_name;\r\n let shortTitle = apiWebPage.title || apiWebPage.author || siteName || '';\r\n if(siteName && shortTitle === siteName) {\r\n delete apiWebPage.site_name;\r\n }\r\n\r\n shortTitle = limitSymbols(shortTitle, 80, 100);\r\n\r\n apiWebPage.rTitle = RichTextProcessor.wrapRichText(shortTitle, {noLinks: true, noLinebreaks: true});\r\n let contextHashtag = '';\r\n if(siteName === 'GitHub') {\r\n const matches = apiWebPage.url.match(/(https?:\\/\\/github\\.com\\/[^\\/]+\\/[^\\/]+)/);\r\n if(matches) {\r\n contextHashtag = matches[0] + '/issues/{1}';\r\n }\r\n }\r\n\r\n // delete apiWebPage.description\r\n const shortDescriptionText = limitSymbols(apiWebPage.description || '', 150, 180);\r\n apiWebPage.rDescription = RichTextProcessor.wrapRichText(shortDescriptionText, {\r\n contextSite: siteName || 'external',\r\n contextHashtag: contextHashtag\r\n });\r\n\r\n if(!photoTypeSet.has(apiWebPage.type) &&\r\n !apiWebPage.description &&\r\n apiWebPage.photo) {\r\n apiWebPage.type = 'photo';\r\n }\r\n }\r\n \r\n let pendingSet = this.pendingWebPages[id];\r\n if(messageKey) {\r\n if(!pendingSet) pendingSet = this.pendingWebPages[id] = new Set();\r\n pendingSet.add(messageKey);\r\n }\r\n \r\n if(oldWebPage === undefined) {\r\n this.webpages[id] = apiWebPage;\r\n } else {\r\n safeReplaceObject(oldWebPage, apiWebPage);\r\n }\r\n \r\n if(!messageKey && pendingSet !== undefined && isUpdated) {\r\n const msgs: {peerId: PeerId, mid: number, isScheduled: boolean}[] = [];\r\n pendingSet.forEach((value) => {\r\n const [peerId, mid, isScheduled] = value.split('_');\r\n msgs.push({\r\n peerId: peerId.toPeerId(), \r\n mid: +mid, \r\n isScheduled: !!isScheduled\r\n });\r\n });\r\n\r\n rootScope.dispatchEvent('webpage_updated', {\r\n id,\r\n msgs\r\n });\r\n }\r\n\r\n return apiWebPage;\r\n }\r\n\r\n public getMessageKeyForPendingWebPage(peerId: PeerId, mid: number, isScheduled?: boolean): WebPageMessageKey {\r\n return peerId + '_' + mid + (isScheduled ? '_s' : '') as any;\r\n }\r\n\r\n public deleteWebPageFromPending(webPage: WebPage, messageKey: WebPageMessageKey) {\r\n const id = (webPage as WebPage.webPage).id;\r\n if(!id) return;\r\n\r\n const set = this.pendingWebPages[id];\r\n if(set && set.has(messageKey)) {\r\n set.delete(messageKey);\r\n\r\n if(!set.size) {\r\n delete this.pendingWebPages[id];\r\n }\r\n }\r\n }\r\n\r\n public getWebPage(id: WebPage.webPage['id']) {\r\n return this.webpages[id];\r\n }\r\n}\r\n\r\nconst appWebPagesManager = new AppWebPagesManager();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.appWebPagesManager = appWebPagesManager);\r\nexport default appWebPagesManager;\r\n","import IS_WEBP_SUPPORTED from \"./webpSupport\";\n\nconst IMAGE_MIME_TYPES_SUPPORTED = new Set([\n 'image/jpeg',\n 'image/png',\n 'image/bmp'\n]);\n\nif(IS_WEBP_SUPPORTED) {\n IMAGE_MIME_TYPES_SUPPORTED.add('image/webp');\n}\n\nexport default IMAGE_MIME_TYPES_SUPPORTED;\n","export const GROUP_CALL_AMPLITUDE_ANALYSE_COUNT_MAX = 50;\nexport const GROUP_CALL_AMPLITUDE_ANALYSE_INTERVAL_MS = 100;\nexport const GROUP_CALL_PARTICIPANTS_LOAD_LIMIT = 100;\n","import simulateEvent from \"../../../helpers/dom/dispatchEvent\";\n\nexport default function stopTrack(track: MediaStreamTrack) {\n track.stop();\n simulateEvent(track, 'ended');\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport type MTProtoConstructor = {\r\n id: number,\r\n predicate: string,\r\n params: Array<{\r\n name: string,\r\n type: string\r\n }>,\r\n type: string\r\n};\r\n\r\nexport type MTProtoMethod = {\r\n id: number,\r\n method: string,\r\n params: Array<{\r\n name: string,\r\n type: string\r\n }>,\r\n type: string\r\n};\r\n\r\nexport default {\"MTProto\":{\"constructors\":[{\"id\":481674261,\"predicate\":\"vector\",\"params\":[],\"type\":\"Vector t\"},{\"id\":85337187,\"predicate\":\"resPQ\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"pq\",\"type\":\"bytes\"},{\"name\":\"server_public_key_fingerprints\",\"type\":\"Vector<long>\"}],\"type\":\"ResPQ\"},{\"id\":-1443537003,\"predicate\":\"p_q_inner_data_dc\",\"params\":[{\"name\":\"pq\",\"type\":\"bytes\"},{\"name\":\"p\",\"type\":\"bytes\"},{\"name\":\"q\",\"type\":\"bytes\"},{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"new_nonce\",\"type\":\"int256\"},{\"name\":\"dc\",\"type\":\"int\"}],\"type\":\"P_Q_inner_data\"},{\"id\":1459478408,\"predicate\":\"p_q_inner_data_temp_dc\",\"params\":[{\"name\":\"pq\",\"type\":\"bytes\"},{\"name\":\"p\",\"type\":\"bytes\"},{\"name\":\"q\",\"type\":\"bytes\"},{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"new_nonce\",\"type\":\"int256\"},{\"name\":\"dc\",\"type\":\"int\"},{\"name\":\"expires_in\",\"type\":\"int\"}],\"type\":\"P_Q_inner_data\"},{\"id\":-790100132,\"predicate\":\"server_DH_params_ok\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"encrypted_answer\",\"type\":\"bytes\"}],\"type\":\"Server_DH_Params\"},{\"id\":-1249309254,\"predicate\":\"server_DH_inner_data\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"g\",\"type\":\"int\"},{\"name\":\"dh_prime\",\"type\":\"bytes\"},{\"name\":\"g_a\",\"type\":\"bytes\"},{\"name\":\"server_time\",\"type\":\"int\"}],\"type\":\"Server_DH_inner_data\"},{\"id\":1715713620,\"predicate\":\"client_DH_inner_data\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"retry_id\",\"type\":\"long\"},{\"name\":\"g_b\",\"type\":\"bytes\"}],\"type\":\"Client_DH_Inner_Data\"},{\"id\":1003222836,\"predicate\":\"dh_gen_ok\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"new_nonce_hash1\",\"type\":\"int128\"}],\"type\":\"Set_client_DH_params_answer\"},{\"id\":1188831161,\"predicate\":\"dh_gen_retry\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"new_nonce_hash2\",\"type\":\"int128\"}],\"type\":\"Set_client_DH_params_answer\"},{\"id\":-1499615742,\"predicate\":\"dh_gen_fail\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"new_nonce_hash3\",\"type\":\"int128\"}],\"type\":\"Set_client_DH_params_answer\"},{\"id\":1973679973,\"predicate\":\"bind_auth_key_inner\",\"params\":[{\"name\":\"nonce\",\"type\":\"long\"},{\"name\":\"temp_auth_key_id\",\"type\":\"long\"},{\"name\":\"perm_auth_key_id\",\"type\":\"long\"},{\"name\":\"temp_session_id\",\"type\":\"long\"},{\"name\":\"expires_at\",\"type\":\"int\"}],\"type\":\"BindAuthKeyInner\"},{\"id\":-212046591,\"predicate\":\"rpc_result\",\"params\":[{\"name\":\"req_msg_id\",\"type\":\"long\"},{\"name\":\"result\",\"type\":\"Object\"}],\"type\":\"RpcResult\"},{\"id\":558156313,\"predicate\":\"rpc_error\",\"params\":[{\"name\":\"error_code\",\"type\":\"int\"},{\"name\":\"error_message\",\"type\":\"string\"}],\"type\":\"RpcError\"},{\"id\":1579864942,\"predicate\":\"rpc_answer_unknown\",\"params\":[],\"type\":\"RpcDropAnswer\"},{\"id\":-847714938,\"predicate\":\"rpc_answer_dropped_running\",\"params\":[],\"type\":\"RpcDropAnswer\"},{\"id\":-1539647305,\"predicate\":\"rpc_answer_dropped\",\"params\":[{\"name\":\"msg_id\",\"type\":\"long\"},{\"name\":\"seq_no\",\"type\":\"int\"},{\"name\":\"bytes\",\"type\":\"int\"}],\"type\":\"RpcDropAnswer\"},{\"id\":155834844,\"predicate\":\"future_salt\",\"params\":[{\"name\":\"valid_since\",\"type\":\"int\"},{\"name\":\"valid_until\",\"type\":\"int\"},{\"name\":\"salt\",\"type\":\"long\"}],\"type\":\"FutureSalt\"},{\"id\":-1370486635,\"predicate\":\"future_salts\",\"params\":[{\"name\":\"req_msg_id\",\"type\":\"long\"},{\"name\":\"now\",\"type\":\"int\"},{\"name\":\"salts\",\"type\":\"vector<future_salt>\"}],\"type\":\"FutureSalts\"},{\"id\":880243653,\"predicate\":\"pong\",\"params\":[{\"name\":\"msg_id\",\"type\":\"long\"},{\"name\":\"ping_id\",\"type\":\"long\"}],\"type\":\"Pong\"},{\"id\":-501201412,\"predicate\":\"destroy_session_ok\",\"params\":[{\"name\":\"session_id\",\"type\":\"long\"}],\"type\":\"DestroySessionRes\"},{\"id\":1658015945,\"predicate\":\"destroy_session_none\",\"params\":[{\"name\":\"session_id\",\"type\":\"long\"}],\"type\":\"DestroySessionRes\"},{\"id\":-1631450872,\"predicate\":\"new_session_created\",\"params\":[{\"name\":\"first_msg_id\",\"type\":\"long\"},{\"name\":\"unique_id\",\"type\":\"long\"},{\"name\":\"server_salt\",\"type\":\"long\"}],\"type\":\"NewSession\"},{\"id\":1945237724,\"predicate\":\"msg_container\",\"params\":[{\"name\":\"messages\",\"type\":\"vector<%Message>\"}],\"type\":\"MessageContainer\"},{\"id\":1538843921,\"predicate\":\"message\",\"params\":[{\"name\":\"msg_id\",\"type\":\"long\"},{\"name\":\"seqno\",\"type\":\"int\"},{\"name\":\"bytes\",\"type\":\"int\"},{\"name\":\"body\",\"type\":\"Object\"}],\"type\":\"Message\"},{\"id\":-530561358,\"predicate\":\"msg_copy\",\"params\":[{\"name\":\"orig_message\",\"type\":\"Message\"}],\"type\":\"MessageCopy\"},{\"id\":812830625,\"predicate\":\"gzip_packed\",\"params\":[{\"name\":\"packed_data\",\"type\":\"bytes\"}],\"type\":\"Object\"},{\"id\":1658238041,\"predicate\":\"msgs_ack\",\"params\":[{\"name\":\"msg_ids\",\"type\":\"Vector<long>\"}],\"type\":\"MsgsAck\"},{\"id\":-1477445615,\"predicate\":\"bad_msg_notification\",\"params\":[{\"name\":\"bad_msg_id\",\"type\":\"long\"},{\"name\":\"bad_msg_seqno\",\"type\":\"int\"},{\"name\":\"error_code\",\"type\":\"int\"}],\"type\":\"BadMsgNotification\"},{\"id\":-307542917,\"predicate\":\"bad_server_salt\",\"params\":[{\"name\":\"bad_msg_id\",\"type\":\"long\"},{\"name\":\"bad_msg_seqno\",\"type\":\"int\"},{\"name\":\"error_code\",\"type\":\"int\"},{\"name\":\"new_server_salt\",\"type\":\"long\"}],\"type\":\"BadMsgNotification\"},{\"id\":2105940488,\"predicate\":\"msg_resend_req\",\"params\":[{\"name\":\"msg_ids\",\"type\":\"Vector<long>\"}],\"type\":\"MsgResendReq\"},{\"id\":-630588590,\"predicate\":\"msgs_state_req\",\"params\":[{\"name\":\"msg_ids\",\"type\":\"Vector<long>\"}],\"type\":\"MsgsStateReq\"},{\"id\":81704317,\"predicate\":\"msgs_state_info\",\"params\":[{\"name\":\"req_msg_id\",\"type\":\"long\"},{\"name\":\"info\",\"type\":\"bytes\"}],\"type\":\"MsgsStateInfo\"},{\"id\":-1933520591,\"predicate\":\"msgs_all_info\",\"params\":[{\"name\":\"msg_ids\",\"type\":\"Vector<long>\"},{\"name\":\"info\",\"type\":\"bytes\"}],\"type\":\"MsgsAllInfo\"},{\"id\":661470918,\"predicate\":\"msg_detailed_info\",\"params\":[{\"name\":\"msg_id\",\"type\":\"long\"},{\"name\":\"answer_msg_id\",\"type\":\"long\"},{\"name\":\"bytes\",\"type\":\"int\"},{\"name\":\"status\",\"type\":\"int\"}],\"type\":\"MsgDetailedInfo\"},{\"id\":-2137147681,\"predicate\":\"msg_new_detailed_info\",\"params\":[{\"name\":\"answer_msg_id\",\"type\":\"long\"},{\"name\":\"bytes\",\"type\":\"int\"},{\"name\":\"status\",\"type\":\"int\"}],\"type\":\"MsgDetailedInfo\"},{\"id\":-161422892,\"predicate\":\"destroy_auth_key_ok\",\"params\":[],\"type\":\"DestroyAuthKeyRes\"},{\"id\":178201177,\"predicate\":\"destroy_auth_key_none\",\"params\":[],\"type\":\"DestroyAuthKeyRes\"},{\"id\":-368010477,\"predicate\":\"destroy_auth_key_fail\",\"params\":[],\"type\":\"DestroyAuthKeyRes\"}],\"methods\":[{\"id\":-1099002127,\"method\":\"req_pq_multi\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"}],\"type\":\"ResPQ\"},{\"id\":-686627650,\"method\":\"req_DH_params\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"p\",\"type\":\"bytes\"},{\"name\":\"q\",\"type\":\"bytes\"},{\"name\":\"public_key_fingerprint\",\"type\":\"long\"},{\"name\":\"encrypted_data\",\"type\":\"bytes\"}],\"type\":\"Server_DH_Params\"},{\"id\":-184262881,\"method\":\"set_client_DH_params\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"encrypted_data\",\"type\":\"bytes\"}],\"type\":\"Set_client_DH_params_answer\"},{\"id\":1491380032,\"method\":\"rpc_drop_answer\",\"params\":[{\"name\":\"req_msg_id\",\"type\":\"long\"}],\"type\":\"RpcDropAnswer\"},{\"id\":-1188971260,\"method\":\"get_future_salts\",\"params\":[{\"name\":\"num\",\"type\":\"int\"}],\"type\":\"FutureSalts\"},{\"id\":2059302892,\"method\":\"ping\",\"params\":[{\"name\":\"ping_id\",\"type\":\"long\"}],\"type\":\"Pong\"},{\"id\":-213746804,\"method\":\"ping_delay_disconnect\",\"params\":[{\"name\":\"ping_id\",\"type\":\"long\"},{\"name\":\"disconnect_delay\",\"type\":\"int\"}],\"type\":\"Pong\"},{\"id\":-414113498,\"method\":\"destroy_session\",\"params\":[{\"name\":\"session_id\",\"type\":\"long\"}],\"type\":\"DestroySessionRes\"},{\"id\":-1835453025,\"method\":\"http_wait\",\"params\":[{\"name\":\"max_delay\",\"type\":\"int\"},{\"name\":\"wait_after\",\"type\":\"int\"},{\"name\":\"max_wait\",\"type\":\"int\"}],\"type\":\"HttpWait\"},{\"id\":-784117408,\"method\":\"destroy_auth_key\",\"params\":[],\"type\":\"DestroyAuthKeyRes\"}]},\"API\":{\"constructors\":[{\"id\":-1132882121,\"predicate\":\"boolFalse\",\"params\":[],\"type\":\"Bool\"},{\"id\":-1720552011,\"predicate\":\"boolTrue\",\"params\":[],\"type\":\"Bool\"},{\"id\":1072550713,\"predicate\":\"true\",\"params\":[],\"type\":\"True\"},{\"id\":481674261,\"predicate\":\"vector\",\"params\":[],\"type\":\"Vector t\"},{\"id\":-994444869,\"predicate\":\"error\",\"params\":[{\"name\":\"code\",\"type\":\"int\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"Error\"},{\"id\":1450380236,\"predicate\":\"null\",\"params\":[],\"type\":\"Null\"},{\"id\":2134579434,\"predicate\":\"inputPeerEmpty\",\"params\":[],\"type\":\"InputPeer\"},{\"id\":2107670217,\"predicate\":\"inputPeerSelf\",\"params\":[],\"type\":\"InputPeer\"},{\"id\":900291769,\"predicate\":\"inputPeerChat\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"}],\"type\":\"InputPeer\"},{\"id\":-571955892,\"predicate\":\"inputPeerUser\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputPeer\"},{\"id\":666680316,\"predicate\":\"inputPeerChannel\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputPeer\"},{\"id\":-1468331492,\"predicate\":\"inputPeerUserFromMessage\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"long\"}],\"type\":\"InputPeer\"},{\"id\":-1121318848,\"predicate\":\"inputPeerChannelFromMessage\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"channel_id\",\"type\":\"long\"}],\"type\":\"InputPeer\"},{\"id\":-1182234929,\"predicate\":\"inputUserEmpty\",\"params\":[],\"type\":\"InputUser\"},{\"id\":-138301121,\"predicate\":\"inputUserSelf\",\"params\":[],\"type\":\"InputUser\"},{\"id\":-233744186,\"predicate\":\"inputUser\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputUser\"},{\"id\":497305826,\"predicate\":\"inputUserFromMessage\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"long\"}],\"type\":\"InputUser\"},{\"id\":-208488460,\"predicate\":\"inputPhoneContact\",\"params\":[{\"name\":\"client_id\",\"type\":\"long\"},{\"name\":\"phone\",\"type\":\"string\"},{\"name\":\"first_name\",\"type\":\"string\"},{\"name\":\"last_name\",\"type\":\"string\"}],\"type\":\"InputContact\"},{\"id\":-181407105,\"predicate\":\"inputFile\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"parts\",\"type\":\"int\"},{\"name\":\"name\",\"type\":\"string\"},{\"name\":\"md5_checksum\",\"type\":\"string\"}],\"type\":\"InputFile\"},{\"id\":-95482955,\"predicate\":\"inputFileBig\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"parts\",\"type\":\"int\"},{\"name\":\"name\",\"type\":\"string\"}],\"type\":\"InputFile\"},{\"id\":-1771768449,\"predicate\":\"inputMediaEmpty\",\"params\":[],\"type\":\"InputMedia\"},{\"id\":505969924,\"predicate\":\"inputMediaUploadedPhoto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"file\",\"type\":\"InputFile\"},{\"name\":\"stickers\",\"type\":\"flags.0?Vector<InputDocument>\"},{\"name\":\"ttl_seconds\",\"type\":\"flags.1?int\"}],\"type\":\"InputMedia\"},{\"id\":-1279654347,\"predicate\":\"inputMediaPhoto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"InputPhoto\"},{\"name\":\"ttl_seconds\",\"type\":\"flags.0?int\"}],\"type\":\"InputMedia\"},{\"id\":-104578748,\"predicate\":\"inputMediaGeoPoint\",\"params\":[{\"name\":\"geo_point\",\"type\":\"InputGeoPoint\"}],\"type\":\"InputMedia\"},{\"id\":-122978821,\"predicate\":\"inputMediaContact\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"first_name\",\"type\":\"string\"},{\"name\":\"last_name\",\"type\":\"string\"},{\"name\":\"vcard\",\"type\":\"string\"}],\"type\":\"InputMedia\"},{\"id\":1530447553,\"predicate\":\"inputMediaUploadedDocument\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"nosound_video\",\"type\":\"flags.3?true\"},{\"name\":\"force_file\",\"type\":\"flags.4?true\"},{\"name\":\"file\",\"type\":\"InputFile\"},{\"name\":\"thumb\",\"type\":\"flags.2?InputFile\"},{\"name\":\"mime_type\",\"type\":\"string\"},{\"name\":\"attributes\",\"type\":\"Vector<DocumentAttribute>\"},{\"name\":\"stickers\",\"type\":\"flags.0?Vector<InputDocument>\"},{\"name\":\"ttl_seconds\",\"type\":\"flags.1?int\"}],\"type\":\"InputMedia\"},{\"id\":860303448,\"predicate\":\"inputMediaDocument\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"InputDocument\"},{\"name\":\"ttl_seconds\",\"type\":\"flags.0?int\"},{\"name\":\"query\",\"type\":\"flags.1?string\"}],\"type\":\"InputMedia\"},{\"id\":-1052959727,\"predicate\":\"inputMediaVenue\",\"params\":[{\"name\":\"geo_point\",\"type\":\"InputGeoPoint\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"address\",\"type\":\"string\"},{\"name\":\"provider\",\"type\":\"string\"},{\"name\":\"venue_id\",\"type\":\"string\"},{\"name\":\"venue_type\",\"type\":\"string\"}],\"type\":\"InputMedia\"},{\"id\":-440664550,\"predicate\":\"inputMediaPhotoExternal\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"ttl_seconds\",\"type\":\"flags.0?int\"}],\"type\":\"InputMedia\"},{\"id\":-78455655,\"predicate\":\"inputMediaDocumentExternal\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"ttl_seconds\",\"type\":\"flags.0?int\"}],\"type\":\"InputMedia\"},{\"id\":-750828557,\"predicate\":\"inputMediaGame\",\"params\":[{\"name\":\"id\",\"type\":\"InputGame\"}],\"type\":\"InputMedia\"},{\"id\":-646342540,\"predicate\":\"inputMediaInvoice\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"description\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"flags.0?InputWebDocument\"},{\"name\":\"invoice\",\"type\":\"Invoice\"},{\"name\":\"payload\",\"type\":\"bytes\"},{\"name\":\"provider\",\"type\":\"string\"},{\"name\":\"provider_data\",\"type\":\"DataJSON\"},{\"name\":\"start_param\",\"type\":\"flags.1?string\"}],\"type\":\"InputMedia\"},{\"id\":-1759532989,\"predicate\":\"inputMediaGeoLive\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"stopped\",\"type\":\"flags.0?true\"},{\"name\":\"geo_point\",\"type\":\"InputGeoPoint\"},{\"name\":\"heading\",\"type\":\"flags.2?int\"},{\"name\":\"period\",\"type\":\"flags.1?int\"},{\"name\":\"proximity_notification_radius\",\"type\":\"flags.3?int\"}],\"type\":\"InputMedia\"},{\"id\":261416433,\"predicate\":\"inputMediaPoll\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"poll\",\"type\":\"Poll\"},{\"name\":\"correct_answers\",\"type\":\"flags.0?Vector<bytes>\"},{\"name\":\"solution\",\"type\":\"flags.1?string\"},{\"name\":\"solution_entities\",\"type\":\"flags.1?Vector<MessageEntity>\"}],\"type\":\"InputMedia\"},{\"id\":-428884101,\"predicate\":\"inputMediaDice\",\"params\":[{\"name\":\"emoticon\",\"type\":\"string\"}],\"type\":\"InputMedia\"},{\"id\":480546647,\"predicate\":\"inputChatPhotoEmpty\",\"params\":[],\"type\":\"InputChatPhoto\"},{\"id\":-968723890,\"predicate\":\"inputChatUploadedPhoto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"file\",\"type\":\"flags.0?InputFile\"},{\"name\":\"video\",\"type\":\"flags.1?InputFile\"},{\"name\":\"video_start_ts\",\"type\":\"flags.2?double\"}],\"type\":\"InputChatPhoto\"},{\"id\":-1991004873,\"predicate\":\"inputChatPhoto\",\"params\":[{\"name\":\"id\",\"type\":\"InputPhoto\"}],\"type\":\"InputChatPhoto\"},{\"id\":-457104426,\"predicate\":\"inputGeoPointEmpty\",\"params\":[],\"type\":\"InputGeoPoint\"},{\"id\":1210199983,\"predicate\":\"inputGeoPoint\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"lat\",\"type\":\"double\"},{\"name\":\"long\",\"type\":\"double\"},{\"name\":\"accuracy_radius\",\"type\":\"flags.0?int\"}],\"type\":\"InputGeoPoint\"},{\"id\":483901197,\"predicate\":\"inputPhotoEmpty\",\"params\":[],\"type\":\"InputPhoto\"},{\"id\":1001634122,\"predicate\":\"inputPhoto\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"file_reference\",\"type\":\"bytes\"}],\"type\":\"InputPhoto\"},{\"id\":-539317279,\"predicate\":\"inputFileLocation\",\"params\":[{\"name\":\"volume_id\",\"type\":\"long\"},{\"name\":\"local_id\",\"type\":\"int\"},{\"name\":\"secret\",\"type\":\"long\"},{\"name\":\"file_reference\",\"type\":\"bytes\"}],\"type\":\"InputFileLocation\"},{\"id\":-182231723,\"predicate\":\"inputEncryptedFileLocation\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputFileLocation\"},{\"id\":-1160743548,\"predicate\":\"inputDocumentFileLocation\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"file_reference\",\"type\":\"bytes\"},{\"name\":\"thumb_size\",\"type\":\"string\"}],\"type\":\"InputFileLocation\"},{\"id\":-876089816,\"predicate\":\"inputSecureFileLocation\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputFileLocation\"},{\"id\":700340377,\"predicate\":\"inputTakeoutFileLocation\",\"params\":[],\"type\":\"InputFileLocation\"},{\"id\":1075322878,\"predicate\":\"inputPhotoFileLocation\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"file_reference\",\"type\":\"bytes\"},{\"name\":\"thumb_size\",\"type\":\"string\"}],\"type\":\"InputFileLocation\"},{\"id\":-667654413,\"predicate\":\"inputPhotoLegacyFileLocation\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"file_reference\",\"type\":\"bytes\"},{\"name\":\"volume_id\",\"type\":\"long\"},{\"name\":\"local_id\",\"type\":\"int\"},{\"name\":\"secret\",\"type\":\"long\"}],\"type\":\"InputFileLocation\"},{\"id\":925204121,\"predicate\":\"inputPeerPhotoFileLocation\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"big\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"photo_id\",\"type\":\"long\"}],\"type\":\"InputFileLocation\"},{\"id\":-1652231205,\"predicate\":\"inputStickerSetThumb\",\"params\":[{\"name\":\"stickerset\",\"type\":\"InputStickerSet\"},{\"name\":\"thumb_version\",\"type\":\"int\"}],\"type\":\"InputFileLocation\"},{\"id\":93890858,\"predicate\":\"inputGroupCallStream\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"time_ms\",\"type\":\"long\"},{\"name\":\"scale\",\"type\":\"int\"},{\"name\":\"video_channel\",\"type\":\"flags.0?int\"},{\"name\":\"video_quality\",\"type\":\"flags.0?int\"}],\"type\":\"InputFileLocation\"},{\"id\":1498486562,\"predicate\":\"peerUser\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"}],\"type\":\"Peer\"},{\"id\":918946202,\"predicate\":\"peerChat\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"}],\"type\":\"Peer\"},{\"id\":-1566230754,\"predicate\":\"peerChannel\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"}],\"type\":\"Peer\"},{\"id\":-1432995067,\"predicate\":\"storage.fileUnknown\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":1086091090,\"predicate\":\"storage.filePartial\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":8322574,\"predicate\":\"storage.fileJpeg\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":-891180321,\"predicate\":\"storage.fileGif\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":172975040,\"predicate\":\"storage.filePng\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":-1373745011,\"predicate\":\"storage.filePdf\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":1384777335,\"predicate\":\"storage.fileMp3\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":1258941372,\"predicate\":\"storage.fileMov\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":-1278304028,\"predicate\":\"storage.fileMp4\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":276907596,\"predicate\":\"storage.fileWebp\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":-742634630,\"predicate\":\"userEmpty\",\"params\":[{\"name\":\"id\",\"type\":\"long\"}],\"type\":\"User\"},{\"id\":1073147056,\"predicate\":\"user\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"self\",\"type\":\"flags.10?true\"},{\"name\":\"contact\",\"type\":\"flags.11?true\"},{\"name\":\"mutual_contact\",\"type\":\"flags.12?true\"},{\"name\":\"deleted\",\"type\":\"flags.13?true\"},{\"name\":\"bot\",\"type\":\"flags.14?true\"},{\"name\":\"bot_chat_history\",\"type\":\"flags.15?true\"},{\"name\":\"bot_nochats\",\"type\":\"flags.16?true\"},{\"name\":\"verified\",\"type\":\"flags.17?true\"},{\"name\":\"restricted\",\"type\":\"flags.18?true\"},{\"name\":\"min\",\"type\":\"flags.20?true\"},{\"name\":\"bot_inline_geo\",\"type\":\"flags.21?true\"},{\"name\":\"support\",\"type\":\"flags.23?true\"},{\"name\":\"scam\",\"type\":\"flags.24?true\"},{\"name\":\"apply_min_photo\",\"type\":\"flags.25?true\"},{\"name\":\"fake\",\"type\":\"flags.26?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"flags.0?long\"},{\"name\":\"first_name\",\"type\":\"flags.1?string\"},{\"name\":\"last_name\",\"type\":\"flags.2?string\"},{\"name\":\"username\",\"type\":\"flags.3?string\"},{\"name\":\"phone\",\"type\":\"flags.4?string\"},{\"name\":\"photo\",\"type\":\"flags.5?UserProfilePhoto\"},{\"name\":\"status\",\"type\":\"flags.6?UserStatus\"},{\"name\":\"bot_info_version\",\"type\":\"flags.14?int\"},{\"name\":\"restriction_reason\",\"type\":\"flags.18?Vector<RestrictionReason>\"},{\"name\":\"bot_inline_placeholder\",\"type\":\"flags.19?string\"},{\"name\":\"lang_code\",\"type\":\"flags.22?string\"}],\"type\":\"User\"},{\"id\":1326562017,\"predicate\":\"userProfilePhotoEmpty\",\"params\":[],\"type\":\"UserProfilePhoto\"},{\"id\":-2100168954,\"predicate\":\"userProfilePhoto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"has_video\",\"type\":\"flags.0?true\"},{\"name\":\"photo_id\",\"type\":\"long\"},{\"name\":\"stripped_thumb\",\"type\":\"flags.1?bytes\"},{\"name\":\"dc_id\",\"type\":\"int\"}],\"type\":\"UserProfilePhoto\"},{\"id\":164646985,\"predicate\":\"userStatusEmpty\",\"params\":[],\"type\":\"UserStatus\"},{\"id\":-306628279,\"predicate\":\"userStatusOnline\",\"params\":[{\"name\":\"expires\",\"type\":\"int\"}],\"type\":\"UserStatus\"},{\"id\":9203775,\"predicate\":\"userStatusOffline\",\"params\":[{\"name\":\"was_online\",\"type\":\"int\"}],\"type\":\"UserStatus\"},{\"id\":-496024847,\"predicate\":\"userStatusRecently\",\"params\":[],\"type\":\"UserStatus\"},{\"id\":129960444,\"predicate\":\"userStatusLastWeek\",\"params\":[],\"type\":\"UserStatus\"},{\"id\":2011940674,\"predicate\":\"userStatusLastMonth\",\"params\":[],\"type\":\"UserStatus\"},{\"id\":693512293,\"predicate\":\"chatEmpty\",\"params\":[{\"name\":\"id\",\"type\":\"long\"}],\"type\":\"Chat\"},{\"id\":1103884886,\"predicate\":\"chat\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"creator\",\"type\":\"flags.0?true\"},{\"name\":\"kicked\",\"type\":\"flags.1?true\"},{\"name\":\"left\",\"type\":\"flags.2?true\"},{\"name\":\"deactivated\",\"type\":\"flags.5?true\"},{\"name\":\"call_active\",\"type\":\"flags.23?true\"},{\"name\":\"call_not_empty\",\"type\":\"flags.24?true\"},{\"name\":\"noforwards\",\"type\":\"flags.25?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"ChatPhoto\"},{\"name\":\"participants_count\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"version\",\"type\":\"int\"},{\"name\":\"migrated_to\",\"type\":\"flags.6?InputChannel\"},{\"name\":\"admin_rights\",\"type\":\"flags.14?ChatAdminRights\"},{\"name\":\"default_banned_rights\",\"type\":\"flags.18?ChatBannedRights\"}],\"type\":\"Chat\"},{\"id\":1704108455,\"predicate\":\"chatForbidden\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"title\",\"type\":\"string\"}],\"type\":\"Chat\"},{\"id\":-2107528095,\"predicate\":\"channel\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"creator\",\"type\":\"flags.0?true\"},{\"name\":\"left\",\"type\":\"flags.2?true\"},{\"name\":\"broadcast\",\"type\":\"flags.5?true\"},{\"name\":\"verified\",\"type\":\"flags.7?true\"},{\"name\":\"megagroup\",\"type\":\"flags.8?true\"},{\"name\":\"restricted\",\"type\":\"flags.9?true\"},{\"name\":\"signatures\",\"type\":\"flags.11?true\"},{\"name\":\"min\",\"type\":\"flags.12?true\"},{\"name\":\"scam\",\"type\":\"flags.19?true\"},{\"name\":\"has_link\",\"type\":\"flags.20?true\"},{\"name\":\"has_geo\",\"type\":\"flags.21?true\"},{\"name\":\"slowmode_enabled\",\"type\":\"flags.22?true\"},{\"name\":\"call_active\",\"type\":\"flags.23?true\"},{\"name\":\"call_not_empty\",\"type\":\"flags.24?true\"},{\"name\":\"fake\",\"type\":\"flags.25?true\"},{\"name\":\"gigagroup\",\"type\":\"flags.26?true\"},{\"name\":\"noforwards\",\"type\":\"flags.27?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"flags.13?long\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"username\",\"type\":\"flags.6?string\"},{\"name\":\"photo\",\"type\":\"ChatPhoto\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"restriction_reason\",\"type\":\"flags.9?Vector<RestrictionReason>\"},{\"name\":\"admin_rights\",\"type\":\"flags.14?ChatAdminRights\"},{\"name\":\"banned_rights\",\"type\":\"flags.15?ChatBannedRights\"},{\"name\":\"default_banned_rights\",\"type\":\"flags.18?ChatBannedRights\"},{\"name\":\"participants_count\",\"type\":\"flags.17?int\"}],\"type\":\"Chat\"},{\"id\":399807445,\"predicate\":\"channelForbidden\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"broadcast\",\"type\":\"flags.5?true\"},{\"name\":\"megagroup\",\"type\":\"flags.8?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"until_date\",\"type\":\"flags.16?int\"}],\"type\":\"Chat\"},{\"id\":-779165146,\"predicate\":\"chatFull\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"can_set_username\",\"type\":\"flags.7?true\"},{\"name\":\"has_scheduled\",\"type\":\"flags.8?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"about\",\"type\":\"string\"},{\"name\":\"participants\",\"type\":\"ChatParticipants\"},{\"name\":\"chat_photo\",\"type\":\"flags.2?Photo\"},{\"name\":\"notify_settings\",\"type\":\"PeerNotifySettings\"},{\"name\":\"exported_invite\",\"type\":\"flags.13?ExportedChatInvite\"},{\"name\":\"bot_info\",\"type\":\"flags.3?Vector<BotInfo>\"},{\"name\":\"pinned_msg_id\",\"type\":\"flags.6?int\"},{\"name\":\"folder_id\",\"type\":\"flags.11?int\"},{\"name\":\"call\",\"type\":\"flags.12?InputGroupCall\"},{\"name\":\"ttl_period\",\"type\":\"flags.14?int\"},{\"name\":\"groupcall_default_join_as\",\"type\":\"flags.15?Peer\"},{\"name\":\"theme_emoticon\",\"type\":\"flags.16?string\"},{\"name\":\"requests_pending\",\"type\":\"flags.17?int\"},{\"name\":\"recent_requesters\",\"type\":\"flags.17?Vector<long>\"},{\"name\":\"available_reactions\",\"type\":\"flags.18?Vector<string>\"}],\"type\":\"ChatFull\"},{\"id\":-516145888,\"predicate\":\"channelFull\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"can_view_participants\",\"type\":\"flags.3?true\"},{\"name\":\"can_set_username\",\"type\":\"flags.6?true\"},{\"name\":\"can_set_stickers\",\"type\":\"flags.7?true\"},{\"name\":\"hidden_prehistory\",\"type\":\"flags.10?true\"},{\"name\":\"can_set_location\",\"type\":\"flags.16?true\"},{\"name\":\"has_scheduled\",\"type\":\"flags.19?true\"},{\"name\":\"can_view_stats\",\"type\":\"flags.20?true\"},{\"name\":\"blocked\",\"type\":\"flags.22?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"about\",\"type\":\"string\"},{\"name\":\"participants_count\",\"type\":\"flags.0?int\"},{\"name\":\"admins_count\",\"type\":\"flags.1?int\"},{\"name\":\"kicked_count\",\"type\":\"flags.2?int\"},{\"name\":\"banned_count\",\"type\":\"flags.2?int\"},{\"name\":\"online_count\",\"type\":\"flags.13?int\"},{\"name\":\"read_inbox_max_id\",\"type\":\"int\"},{\"name\":\"read_outbox_max_id\",\"type\":\"int\"},{\"name\":\"unread_count\",\"type\":\"int\"},{\"name\":\"chat_photo\",\"type\":\"Photo\"},{\"name\":\"notify_settings\",\"type\":\"PeerNotifySettings\"},{\"name\":\"exported_invite\",\"type\":\"flags.23?ExportedChatInvite\"},{\"name\":\"bot_info\",\"type\":\"Vector<BotInfo>\"},{\"name\":\"migrated_from_chat_id\",\"type\":\"flags.4?long\"},{\"name\":\"migrated_from_max_id\",\"type\":\"flags.4?int\"},{\"name\":\"pinned_msg_id\",\"type\":\"flags.5?int\"},{\"name\":\"stickerset\",\"type\":\"flags.8?StickerSet\"},{\"name\":\"available_min_id\",\"type\":\"flags.9?int\"},{\"name\":\"folder_id\",\"type\":\"flags.11?int\"},{\"name\":\"linked_chat_id\",\"type\":\"flags.14?long\"},{\"name\":\"location\",\"type\":\"flags.15?ChannelLocation\"},{\"name\":\"slowmode_seconds\",\"type\":\"flags.17?int\"},{\"name\":\"slowmode_next_send_date\",\"type\":\"flags.18?int\"},{\"name\":\"stats_dc\",\"type\":\"flags.12?int\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"call\",\"type\":\"flags.21?InputGroupCall\"},{\"name\":\"ttl_period\",\"type\":\"flags.24?int\"},{\"name\":\"pending_suggestions\",\"type\":\"flags.25?Vector<string>\"},{\"name\":\"groupcall_default_join_as\",\"type\":\"flags.26?Peer\"},{\"name\":\"theme_emoticon\",\"type\":\"flags.27?string\"},{\"name\":\"requests_pending\",\"type\":\"flags.28?int\"},{\"name\":\"recent_requesters\",\"type\":\"flags.28?Vector<long>\"},{\"name\":\"default_send_as\",\"type\":\"flags.29?Peer\"},{\"name\":\"available_reactions\",\"type\":\"flags.30?Vector<string>\"}],\"type\":\"ChatFull\"},{\"id\":-1070776313,\"predicate\":\"chatParticipant\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"inviter_id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"ChatParticipant\"},{\"id\":-462696732,\"predicate\":\"chatParticipantCreator\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"}],\"type\":\"ChatParticipant\"},{\"id\":-1600962725,\"predicate\":\"chatParticipantAdmin\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"inviter_id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"ChatParticipant\"},{\"id\":-2023500831,\"predicate\":\"chatParticipantsForbidden\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"self_participant\",\"type\":\"flags.0?ChatParticipant\"}],\"type\":\"ChatParticipants\"},{\"id\":1018991608,\"predicate\":\"chatParticipants\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"participants\",\"type\":\"Vector<ChatParticipant>\"},{\"name\":\"version\",\"type\":\"int\"}],\"type\":\"ChatParticipants\"},{\"id\":935395612,\"predicate\":\"chatPhotoEmpty\",\"params\":[],\"type\":\"ChatPhoto\"},{\"id\":476978193,\"predicate\":\"chatPhoto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"has_video\",\"type\":\"flags.0?true\"},{\"name\":\"photo_id\",\"type\":\"long\"},{\"name\":\"stripped_thumb\",\"type\":\"flags.1?bytes\"},{\"name\":\"dc_id\",\"type\":\"int\"}],\"type\":\"ChatPhoto\"},{\"id\":-1868117372,\"predicate\":\"messageEmpty\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"peer_id\",\"type\":\"flags.0?Peer\"}],\"type\":\"Message\"},{\"id\":940666592,\"predicate\":\"message\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"out\",\"type\":\"flags.1?true\"},{\"name\":\"mentioned\",\"type\":\"flags.4?true\"},{\"name\":\"media_unread\",\"type\":\"flags.5?true\"},{\"name\":\"silent\",\"type\":\"flags.13?true\"},{\"name\":\"post\",\"type\":\"flags.14?true\"},{\"name\":\"from_scheduled\",\"type\":\"flags.18?true\"},{\"name\":\"legacy\",\"type\":\"flags.19?true\"},{\"name\":\"edit_hide\",\"type\":\"flags.21?true\"},{\"name\":\"pinned\",\"type\":\"flags.24?true\"},{\"name\":\"noforwards\",\"type\":\"flags.26?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"from_id\",\"type\":\"flags.8?Peer\"},{\"name\":\"peer_id\",\"type\":\"Peer\"},{\"name\":\"fwd_from\",\"type\":\"flags.2?MessageFwdHeader\"},{\"name\":\"via_bot_id\",\"type\":\"flags.11?long\"},{\"name\":\"reply_to\",\"type\":\"flags.3?MessageReplyHeader\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"media\",\"type\":\"flags.9?MessageMedia\"},{\"name\":\"reply_markup\",\"type\":\"flags.6?ReplyMarkup\"},{\"name\":\"entities\",\"type\":\"flags.7?Vector<MessageEntity>\"},{\"name\":\"views\",\"type\":\"flags.10?int\"},{\"name\":\"forwards\",\"type\":\"flags.10?int\"},{\"name\":\"replies\",\"type\":\"flags.23?MessageReplies\"},{\"name\":\"edit_date\",\"type\":\"flags.15?int\"},{\"name\":\"post_author\",\"type\":\"flags.16?string\"},{\"name\":\"grouped_id\",\"type\":\"flags.17?long\"},{\"name\":\"reactions\",\"type\":\"flags.20?MessageReactions\"},{\"name\":\"restriction_reason\",\"type\":\"flags.22?Vector<RestrictionReason>\"},{\"name\":\"ttl_period\",\"type\":\"flags.25?int\"}],\"type\":\"Message\"},{\"id\":721967202,\"predicate\":\"messageService\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"out\",\"type\":\"flags.1?true\"},{\"name\":\"mentioned\",\"type\":\"flags.4?true\"},{\"name\":\"media_unread\",\"type\":\"flags.5?true\"},{\"name\":\"silent\",\"type\":\"flags.13?true\"},{\"name\":\"post\",\"type\":\"flags.14?true\"},{\"name\":\"legacy\",\"type\":\"flags.19?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"from_id\",\"type\":\"flags.8?Peer\"},{\"name\":\"peer_id\",\"type\":\"Peer\"},{\"name\":\"reply_to\",\"type\":\"flags.3?MessageReplyHeader\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"action\",\"type\":\"MessageAction\"},{\"name\":\"ttl_period\",\"type\":\"flags.25?int\"}],\"type\":\"Message\"},{\"id\":1038967584,\"predicate\":\"messageMediaEmpty\",\"params\":[],\"type\":\"MessageMedia\"},{\"id\":1766936791,\"predicate\":\"messageMediaPhoto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"photo\",\"type\":\"flags.0?Photo\"},{\"name\":\"ttl_seconds\",\"type\":\"flags.2?int\"}],\"type\":\"MessageMedia\"},{\"id\":1457575028,\"predicate\":\"messageMediaGeo\",\"params\":[{\"name\":\"geo\",\"type\":\"GeoPoint\"}],\"type\":\"MessageMedia\"},{\"id\":1882335561,\"predicate\":\"messageMediaContact\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"first_name\",\"type\":\"string\"},{\"name\":\"last_name\",\"type\":\"string\"},{\"name\":\"vcard\",\"type\":\"string\"},{\"name\":\"user_id\",\"type\":\"long\"}],\"type\":\"MessageMedia\"},{\"id\":-1618676578,\"predicate\":\"messageMediaUnsupported\",\"params\":[],\"type\":\"MessageMedia\"},{\"id\":-1666158377,\"predicate\":\"messageMediaDocument\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"document\",\"type\":\"flags.0?Document\"},{\"name\":\"ttl_seconds\",\"type\":\"flags.2?int\"}],\"type\":\"MessageMedia\"},{\"id\":-1557277184,\"predicate\":\"messageMediaWebPage\",\"params\":[{\"name\":\"webpage\",\"type\":\"WebPage\"}],\"type\":\"MessageMedia\"},{\"id\":784356159,\"predicate\":\"messageMediaVenue\",\"params\":[{\"name\":\"geo\",\"type\":\"GeoPoint\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"address\",\"type\":\"string\"},{\"name\":\"provider\",\"type\":\"string\"},{\"name\":\"venue_id\",\"type\":\"string\"},{\"name\":\"venue_type\",\"type\":\"string\"}],\"type\":\"MessageMedia\"},{\"id\":-38694904,\"predicate\":\"messageMediaGame\",\"params\":[{\"name\":\"game\",\"type\":\"Game\"}],\"type\":\"MessageMedia\"},{\"id\":-2074799289,\"predicate\":\"messageMediaInvoice\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"shipping_address_requested\",\"type\":\"flags.1?true\"},{\"name\":\"test\",\"type\":\"flags.3?true\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"description\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"flags.0?WebDocument\"},{\"name\":\"receipt_msg_id\",\"type\":\"flags.2?int\"},{\"name\":\"currency\",\"type\":\"string\"},{\"name\":\"total_amount\",\"type\":\"long\"},{\"name\":\"start_param\",\"type\":\"string\"}],\"type\":\"MessageMedia\"},{\"id\":-1186937242,\"predicate\":\"messageMediaGeoLive\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"geo\",\"type\":\"GeoPoint\"},{\"name\":\"heading\",\"type\":\"flags.0?int\"},{\"name\":\"period\",\"type\":\"int\"},{\"name\":\"proximity_notification_radius\",\"type\":\"flags.1?int\"}],\"type\":\"MessageMedia\"},{\"id\":1272375192,\"predicate\":\"messageMediaPoll\",\"params\":[{\"name\":\"poll\",\"type\":\"Poll\"},{\"name\":\"results\",\"type\":\"PollResults\"}],\"type\":\"MessageMedia\"},{\"id\":1065280907,\"predicate\":\"messageMediaDice\",\"params\":[{\"name\":\"value\",\"type\":\"int\"},{\"name\":\"emoticon\",\"type\":\"string\"}],\"type\":\"MessageMedia\"},{\"id\":-1230047312,\"predicate\":\"messageActionEmpty\",\"params\":[],\"type\":\"MessageAction\"},{\"id\":-1119368275,\"predicate\":\"messageActionChatCreate\",\"params\":[{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"users\",\"type\":\"Vector<long>\"}],\"type\":\"MessageAction\"},{\"id\":-1247687078,\"predicate\":\"messageActionChatEditTitle\",\"params\":[{\"name\":\"title\",\"type\":\"string\"}],\"type\":\"MessageAction\"},{\"id\":2144015272,\"predicate\":\"messageActionChatEditPhoto\",\"params\":[{\"name\":\"photo\",\"type\":\"Photo\"}],\"type\":\"MessageAction\"},{\"id\":-1780220945,\"predicate\":\"messageActionChatDeletePhoto\",\"params\":[],\"type\":\"MessageAction\"},{\"id\":365886720,\"predicate\":\"messageActionChatAddUser\",\"params\":[{\"name\":\"users\",\"type\":\"Vector<long>\"}],\"type\":\"MessageAction\"},{\"id\":-1539362612,\"predicate\":\"messageActionChatDeleteUser\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"}],\"type\":\"MessageAction\"},{\"id\":51520707,\"predicate\":\"messageActionChatJoinedByLink\",\"params\":[{\"name\":\"inviter_id\",\"type\":\"long\"}],\"type\":\"MessageAction\"},{\"id\":-1781355374,\"predicate\":\"messageActionChannelCreate\",\"params\":[{\"name\":\"title\",\"type\":\"string\"}],\"type\":\"MessageAction\"},{\"id\":-519864430,\"predicate\":\"messageActionChatMigrateTo\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"}],\"type\":\"MessageAction\"},{\"id\":-365344535,\"predicate\":\"messageActionChannelMigrateFrom\",\"params\":[{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"chat_id\",\"type\":\"long\"}],\"type\":\"MessageAction\"},{\"id\":-1799538451,\"predicate\":\"messageActionPinMessage\",\"params\":[],\"type\":\"MessageAction\"},{\"id\":-1615153660,\"predicate\":\"messageActionHistoryClear\",\"params\":[],\"type\":\"MessageAction\"},{\"id\":-1834538890,\"predicate\":\"messageActionGameScore\",\"params\":[{\"name\":\"game_id\",\"type\":\"long\"},{\"name\":\"score\",\"type\":\"int\"}],\"type\":\"MessageAction\"},{\"id\":-1892568281,\"predicate\":\"messageActionPaymentSentMe\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"currency\",\"type\":\"string\"},{\"name\":\"total_amount\",\"type\":\"long\"},{\"name\":\"payload\",\"type\":\"bytes\"},{\"name\":\"info\",\"type\":\"flags.0?PaymentRequestedInfo\"},{\"name\":\"shipping_option_id\",\"type\":\"flags.1?string\"},{\"name\":\"charge\",\"type\":\"PaymentCharge\"}],\"type\":\"MessageAction\"},{\"id\":1080663248,\"predicate\":\"messageActionPaymentSent\",\"params\":[{\"name\":\"currency\",\"type\":\"string\"},{\"name\":\"total_amount\",\"type\":\"long\"}],\"type\":\"MessageAction\"},{\"id\":-2132731265,\"predicate\":\"messageActionPhoneCall\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"video\",\"type\":\"flags.2?true\"},{\"name\":\"call_id\",\"type\":\"long\"},{\"name\":\"reason\",\"type\":\"flags.0?PhoneCallDiscardReason\"},{\"name\":\"duration\",\"type\":\"flags.1?int\"}],\"type\":\"MessageAction\"},{\"id\":1200788123,\"predicate\":\"messageActionScreenshotTaken\",\"params\":[],\"type\":\"MessageAction\"},{\"id\":-85549226,\"predicate\":\"messageActionCustomAction\",\"params\":[{\"name\":\"message\",\"type\":\"string\"}],\"type\":\"MessageAction\"},{\"id\":-1410748418,\"predicate\":\"messageActionBotAllowed\",\"params\":[{\"name\":\"domain\",\"type\":\"string\"}],\"type\":\"MessageAction\"},{\"id\":455635795,\"predicate\":\"messageActionSecureValuesSentMe\",\"params\":[{\"name\":\"values\",\"type\":\"Vector<SecureValue>\"},{\"name\":\"credentials\",\"type\":\"SecureCredentialsEncrypted\"}],\"type\":\"MessageAction\"},{\"id\":-648257196,\"predicate\":\"messageActionSecureValuesSent\",\"params\":[{\"name\":\"types\",\"type\":\"Vector<SecureValueType>\"}],\"type\":\"MessageAction\"},{\"id\":-202219658,\"predicate\":\"messageActionContactSignUp\",\"params\":[],\"type\":\"MessageAction\"},{\"id\":-1730095465,\"predicate\":\"messageActionGeoProximityReached\",\"params\":[{\"name\":\"from_id\",\"type\":\"Peer\"},{\"name\":\"to_id\",\"type\":\"Peer\"},{\"name\":\"distance\",\"type\":\"int\"}],\"type\":\"MessageAction\"},{\"id\":2047704898,\"predicate\":\"messageActionGroupCall\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"duration\",\"type\":\"flags.0?int\"}],\"type\":\"MessageAction\"},{\"id\":1345295095,\"predicate\":\"messageActionInviteToGroupCall\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"users\",\"type\":\"Vector<long>\"}],\"type\":\"MessageAction\"},{\"id\":-1441072131,\"predicate\":\"messageActionSetMessagesTTL\",\"params\":[{\"name\":\"period\",\"type\":\"int\"}],\"type\":\"MessageAction\"},{\"id\":-1281329567,\"predicate\":\"messageActionGroupCallScheduled\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"schedule_date\",\"type\":\"int\"}],\"type\":\"MessageAction\"},{\"id\":-1434950843,\"predicate\":\"messageActionSetChatTheme\",\"params\":[{\"name\":\"emoticon\",\"type\":\"string\"}],\"type\":\"MessageAction\"},{\"id\":-339958837,\"predicate\":\"messageActionChatJoinedByRequest\",\"params\":[],\"type\":\"MessageAction\"},{\"id\":739712882,\"predicate\":\"dialog\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"pinned\",\"type\":\"flags.2?true\"},{\"name\":\"unread_mark\",\"type\":\"flags.3?true\"},{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"top_message\",\"type\":\"int\"},{\"name\":\"read_inbox_max_id\",\"type\":\"int\"},{\"name\":\"read_outbox_max_id\",\"type\":\"int\"},{\"name\":\"unread_count\",\"type\":\"int\"},{\"name\":\"unread_mentions_count\",\"type\":\"int\"},{\"name\":\"notify_settings\",\"type\":\"PeerNotifySettings\"},{\"name\":\"pts\",\"type\":\"flags.0?int\"},{\"name\":\"draft\",\"type\":\"flags.1?DraftMessage\"},{\"name\":\"folder_id\",\"type\":\"flags.4?int\"}],\"type\":\"Dialog\"},{\"id\":1908216652,\"predicate\":\"dialogFolder\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"pinned\",\"type\":\"flags.2?true\"},{\"name\":\"folder\",\"type\":\"Folder\"},{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"top_message\",\"type\":\"int\"},{\"name\":\"unread_muted_peers_count\",\"type\":\"int\"},{\"name\":\"unread_unmuted_peers_count\",\"type\":\"int\"},{\"name\":\"unread_muted_messages_count\",\"type\":\"int\"},{\"name\":\"unread_unmuted_messages_count\",\"type\":\"int\"}],\"type\":\"Dialog\"},{\"id\":590459437,\"predicate\":\"photoEmpty\",\"params\":[{\"name\":\"id\",\"type\":\"long\"}],\"type\":\"Photo\"},{\"id\":-82216347,\"predicate\":\"photo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"has_stickers\",\"type\":\"flags.0?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"file_reference\",\"type\":\"bytes\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"sizes\",\"type\":\"Vector<PhotoSize>\"},{\"name\":\"video_sizes\",\"type\":\"flags.1?Vector<VideoSize>\"},{\"name\":\"dc_id\",\"type\":\"int\"}],\"type\":\"Photo\"},{\"id\":236446268,\"predicate\":\"photoSizeEmpty\",\"params\":[{\"name\":\"type\",\"type\":\"string\"}],\"type\":\"PhotoSize\"},{\"id\":1976012384,\"predicate\":\"photoSize\",\"params\":[{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"w\",\"type\":\"int\"},{\"name\":\"h\",\"type\":\"int\"},{\"name\":\"size\",\"type\":\"int\"}],\"type\":\"PhotoSize\"},{\"id\":35527382,\"predicate\":\"photoCachedSize\",\"params\":[{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"w\",\"type\":\"int\"},{\"name\":\"h\",\"type\":\"int\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"PhotoSize\"},{\"id\":-525288402,\"predicate\":\"photoStrippedSize\",\"params\":[{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"PhotoSize\"},{\"id\":-96535659,\"predicate\":\"photoSizeProgressive\",\"params\":[{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"w\",\"type\":\"int\"},{\"name\":\"h\",\"type\":\"int\"},{\"name\":\"sizes\",\"type\":\"Vector<int>\"}],\"type\":\"PhotoSize\"},{\"id\":-668906175,\"predicate\":\"photoPathSize\",\"params\":[{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"PhotoSize\"},{\"id\":286776671,\"predicate\":\"geoPointEmpty\",\"params\":[],\"type\":\"GeoPoint\"},{\"id\":-1297942941,\"predicate\":\"geoPoint\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"long\",\"type\":\"double\"},{\"name\":\"lat\",\"type\":\"double\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"accuracy_radius\",\"type\":\"flags.0?int\"}],\"type\":\"GeoPoint\"},{\"id\":1577067778,\"predicate\":\"auth.sentCode\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"type\",\"type\":\"auth.SentCodeType\"},{\"name\":\"phone_code_hash\",\"type\":\"string\"},{\"name\":\"next_type\",\"type\":\"flags.1?auth.CodeType\"},{\"name\":\"timeout\",\"type\":\"flags.2?int\"}],\"type\":\"auth.SentCode\"},{\"id\":872119224,\"predicate\":\"auth.authorization\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"setup_password_required\",\"type\":\"flags.1?true\"},{\"name\":\"otherwise_relogin_days\",\"type\":\"flags.1?int\"},{\"name\":\"tmp_sessions\",\"type\":\"flags.0?int\"},{\"name\":\"user\",\"type\":\"User\"}],\"type\":\"auth.Authorization\"},{\"id\":1148485274,\"predicate\":\"auth.authorizationSignUpRequired\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"terms_of_service\",\"type\":\"flags.0?help.TermsOfService\"}],\"type\":\"auth.Authorization\"},{\"id\":-1271602504,\"predicate\":\"auth.exportedAuthorization\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"auth.ExportedAuthorization\"},{\"id\":-1195615476,\"predicate\":\"inputNotifyPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"InputNotifyPeer\"},{\"id\":423314455,\"predicate\":\"inputNotifyUsers\",\"params\":[],\"type\":\"InputNotifyPeer\"},{\"id\":1251338318,\"predicate\":\"inputNotifyChats\",\"params\":[],\"type\":\"InputNotifyPeer\"},{\"id\":-1311015810,\"predicate\":\"inputNotifyBroadcasts\",\"params\":[],\"type\":\"InputNotifyPeer\"},{\"id\":-1673717362,\"predicate\":\"inputPeerNotifySettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"show_previews\",\"type\":\"flags.0?Bool\"},{\"name\":\"silent\",\"type\":\"flags.1?Bool\"},{\"name\":\"mute_until\",\"type\":\"flags.2?int\"},{\"name\":\"sound\",\"type\":\"flags.3?string\"}],\"type\":\"InputPeerNotifySettings\"},{\"id\":-1353671392,\"predicate\":\"peerNotifySettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"show_previews\",\"type\":\"flags.0?Bool\"},{\"name\":\"silent\",\"type\":\"flags.1?Bool\"},{\"name\":\"mute_until\",\"type\":\"flags.2?int\"},{\"name\":\"sound\",\"type\":\"flags.3?string\"}],\"type\":\"PeerNotifySettings\"},{\"id\":-1525149427,\"predicate\":\"peerSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"report_spam\",\"type\":\"flags.0?true\"},{\"name\":\"add_contact\",\"type\":\"flags.1?true\"},{\"name\":\"block_contact\",\"type\":\"flags.2?true\"},{\"name\":\"share_contact\",\"type\":\"flags.3?true\"},{\"name\":\"need_contacts_exception\",\"type\":\"flags.4?true\"},{\"name\":\"report_geo\",\"type\":\"flags.5?true\"},{\"name\":\"autoarchived\",\"type\":\"flags.7?true\"},{\"name\":\"invite_members\",\"type\":\"flags.8?true\"},{\"name\":\"request_chat_broadcast\",\"type\":\"flags.10?true\"},{\"name\":\"geo_distance\",\"type\":\"flags.6?int\"},{\"name\":\"request_chat_title\",\"type\":\"flags.9?string\"},{\"name\":\"request_chat_date\",\"type\":\"flags.9?int\"}],\"type\":\"PeerSettings\"},{\"id\":-1539849235,\"predicate\":\"wallPaper\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"creator\",\"type\":\"flags.0?true\"},{\"name\":\"default\",\"type\":\"flags.1?true\"},{\"name\":\"pattern\",\"type\":\"flags.3?true\"},{\"name\":\"dark\",\"type\":\"flags.4?true\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"slug\",\"type\":\"string\"},{\"name\":\"document\",\"type\":\"Document\"},{\"name\":\"settings\",\"type\":\"flags.2?WallPaperSettings\"}],\"type\":\"WallPaper\"},{\"id\":-528465642,\"predicate\":\"wallPaperNoFile\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"default\",\"type\":\"flags.1?true\"},{\"name\":\"dark\",\"type\":\"flags.4?true\"},{\"name\":\"settings\",\"type\":\"flags.2?WallPaperSettings\"}],\"type\":\"WallPaper\"},{\"id\":1490799288,\"predicate\":\"inputReportReasonSpam\",\"params\":[],\"type\":\"ReportReason\"},{\"id\":505595789,\"predicate\":\"inputReportReasonViolence\",\"params\":[],\"type\":\"ReportReason\"},{\"id\":777640226,\"predicate\":\"inputReportReasonPornography\",\"params\":[],\"type\":\"ReportReason\"},{\"id\":-1376497949,\"predicate\":\"inputReportReasonChildAbuse\",\"params\":[],\"type\":\"ReportReason\"},{\"id\":-1041980751,\"predicate\":\"inputReportReasonOther\",\"params\":[],\"type\":\"ReportReason\"},{\"id\":-1685456582,\"predicate\":\"inputReportReasonCopyright\",\"params\":[],\"type\":\"ReportReason\"},{\"id\":-606798099,\"predicate\":\"inputReportReasonGeoIrrelevant\",\"params\":[],\"type\":\"ReportReason\"},{\"id\":-170010905,\"predicate\":\"inputReportReasonFake\",\"params\":[],\"type\":\"ReportReason\"},{\"id\":-818518751,\"predicate\":\"userFull\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"blocked\",\"type\":\"flags.0?true\"},{\"name\":\"phone_calls_available\",\"type\":\"flags.4?true\"},{\"name\":\"phone_calls_private\",\"type\":\"flags.5?true\"},{\"name\":\"can_pin_message\",\"type\":\"flags.7?true\"},{\"name\":\"has_scheduled\",\"type\":\"flags.12?true\"},{\"name\":\"video_calls_available\",\"type\":\"flags.13?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"about\",\"type\":\"flags.1?string\"},{\"name\":\"settings\",\"type\":\"PeerSettings\"},{\"name\":\"profile_photo\",\"type\":\"flags.2?Photo\"},{\"name\":\"notify_settings\",\"type\":\"PeerNotifySettings\"},{\"name\":\"bot_info\",\"type\":\"flags.3?BotInfo\"},{\"name\":\"pinned_msg_id\",\"type\":\"flags.6?int\"},{\"name\":\"common_chats_count\",\"type\":\"int\"},{\"name\":\"folder_id\",\"type\":\"flags.11?int\"},{\"name\":\"ttl_period\",\"type\":\"flags.14?int\"},{\"name\":\"theme_emoticon\",\"type\":\"flags.15?string\"},{\"name\":\"private_forward_name\",\"type\":\"flags.16?string\"}],\"type\":\"UserFull\"},{\"id\":341499403,\"predicate\":\"contact\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"mutual\",\"type\":\"Bool\"}],\"type\":\"Contact\"},{\"id\":-1052885936,\"predicate\":\"importedContact\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"client_id\",\"type\":\"long\"}],\"type\":\"ImportedContact\"},{\"id\":383348795,\"predicate\":\"contactStatus\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"status\",\"type\":\"UserStatus\"}],\"type\":\"ContactStatus\"},{\"id\":-1219778094,\"predicate\":\"contacts.contactsNotModified\",\"params\":[],\"type\":\"contacts.Contacts\"},{\"id\":-353862078,\"predicate\":\"contacts.contacts\",\"params\":[{\"name\":\"contacts\",\"type\":\"Vector<Contact>\"},{\"name\":\"saved_count\",\"type\":\"int\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"contacts.Contacts\"},{\"id\":2010127419,\"predicate\":\"contacts.importedContacts\",\"params\":[{\"name\":\"imported\",\"type\":\"Vector<ImportedContact>\"},{\"name\":\"popular_invites\",\"type\":\"Vector<PopularContact>\"},{\"name\":\"retry_contacts\",\"type\":\"Vector<long>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"contacts.ImportedContacts\"},{\"id\":182326673,\"predicate\":\"contacts.blocked\",\"params\":[{\"name\":\"blocked\",\"type\":\"Vector<PeerBlocked>\"},{\"name\":\"chats\",\"type\":\"Vector<Chat>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"contacts.Blocked\"},{\"id\":-513392236,\"predicate\":\"contacts.blockedSlice\",\"params\":[{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"blocked\",\"type\":\"Vector<PeerBlocked>\"},{\"name\":\"chats\",\"type\":\"Vector<Chat>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"contacts.Blocked\"},{\"id\":364538944,\"predicate\":\"messages.dialogs\",\"params\":[{\"name\":\"dialogs\",\"type\":\"Vector<Dialog>\"},{\"name\":\"messages\",\"type\":\"Vector<Message>\"},{\"name\":\"chats\",\"type\":\"Vector<Chat>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"messages.Dialogs\"},{\"id\":1910543603,\"predicate\":\"messages.dialogsSlice\",\"params\":[{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"dialogs\",\"type\":\"Vector<Dialog>\"},{\"name\":\"messages\",\"type\":\"Vector<Message>\"},{\"name\":\"chats\",\"type\":\"Vector<Chat>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"messages.Dialogs\"},{\"id\":-253500010,\"predicate\":\"messages.dialogsNotModified\",\"params\":[{\"name\":\"count\",\"type\":\"int\"}],\"type\":\"messages.Dialogs\"},{\"id\":-1938715001,\"predicate\":\"messages.messages\",\"params\":[{\"name\":\"messages\",\"type\":\"Vector<Message>\"},{\"name\":\"chats\",\"type\":\"Vector<Chat>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"messages.Messages\"},{\"id\":978610270,\"predicate\":\"messages.messagesSlice\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"inexact\",\"type\":\"flags.1?true\"},{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"next_rate\",\"type\":\"flags.0?int\"},{\"name\":\"offset_id_offset\",\"type\":\"flags.2?int\"},{\"name\":\"messages\",\"type\":\"Vector<Message>\"},{\"name\":\"chats\",\"type\":\"Vector<Chat>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"messages.Messages\"},{\"id\":1682413576,\"predicate\":\"messages.channelMessages\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"inexact\",\"type\":\"flags.1?true\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"offset_id_offset\",\"type\":\"flags.2?int\"},{\"name\":\"messages\",\"type\":\"Vector<Message>\"},{\"name\":\"chats\",\"type\":\"Vector<Chat>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"messages.Messages\"},{\"id\":1951620897,\"predicate\":\"messages.messagesNotModified\",\"params\":[{\"name\":\"count\",\"type\":\"int\"}],\"type\":\"messages.Messages\"},{\"id\":1694474197,\"predicate\":\"messages.chats\",\"params\":[{\"name\":\"chats\",\"type\":\"Vector<Chat>\"}],\"type\":\"messages.Chats\"},{\"id\":-1663561404,\"predicate\":\"messages.chatsSlice\",\"params\":[{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"chats\",\"type\":\"Vector<Chat>\"}],\"type\":\"messages.Chats\"},{\"id\":-438840932,\"predicate\":\"messages.chatFull\",\"params\":[{\"name\":\"full_chat\",\"type\":\"ChatFull\"},{\"name\":\"chats\",\"type\":\"Vector<Chat>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"messages.ChatFull\"},{\"id\":-1269012015,\"predicate\":\"messages.affectedHistory\",\"params\":[{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"},{\"name\":\"offset\",\"type\":\"int\"}],\"type\":\"messages.AffectedHistory\"},{\"id\":1474492012,\"predicate\":\"inputMessagesFilterEmpty\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":-1777752804,\"predicate\":\"inputMessagesFilterPhotos\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":-1614803355,\"predicate\":\"inputMessagesFilterVideo\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":1458172132,\"predicate\":\"inputMessagesFilterPhotoVideo\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":-1629621880,\"predicate\":\"inputMessagesFilterDocument\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":2129714567,\"predicate\":\"inputMessagesFilterUrl\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":-3644025,\"predicate\":\"inputMessagesFilterGif\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":1358283666,\"predicate\":\"inputMessagesFilterVoice\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":928101534,\"predicate\":\"inputMessagesFilterMusic\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":975236280,\"predicate\":\"inputMessagesFilterChatPhotos\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":-2134272152,\"predicate\":\"inputMessagesFilterPhoneCalls\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"missed\",\"type\":\"flags.0?true\"}],\"type\":\"MessagesFilter\"},{\"id\":2054952868,\"predicate\":\"inputMessagesFilterRoundVoice\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":-1253451181,\"predicate\":\"inputMessagesFilterRoundVideo\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":-1040652646,\"predicate\":\"inputMessagesFilterMyMentions\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":-419271411,\"predicate\":\"inputMessagesFilterGeo\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":-530392189,\"predicate\":\"inputMessagesFilterContacts\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":464520273,\"predicate\":\"inputMessagesFilterPinned\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":522914557,\"predicate\":\"updateNewMessage\",\"params\":[{\"name\":\"message\",\"type\":\"Message\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":1318109142,\"predicate\":\"updateMessageID\",\"params\":[{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"random_id\",\"type\":\"long\"}],\"type\":\"Update\"},{\"id\":-1576161051,\"predicate\":\"updateDeleteMessages\",\"params\":[{\"name\":\"messages\",\"type\":\"Vector<int>\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-1071741569,\"predicate\":\"updateUserTyping\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"action\",\"type\":\"SendMessageAction\"}],\"type\":\"Update\"},{\"id\":-2092401936,\"predicate\":\"updateChatUserTyping\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"from_id\",\"type\":\"Peer\"},{\"name\":\"action\",\"type\":\"SendMessageAction\"}],\"type\":\"Update\"},{\"id\":125178264,\"predicate\":\"updateChatParticipants\",\"params\":[{\"name\":\"participants\",\"type\":\"ChatParticipants\"}],\"type\":\"Update\"},{\"id\":-440534818,\"predicate\":\"updateUserStatus\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"status\",\"type\":\"UserStatus\"}],\"type\":\"Update\"},{\"id\":-1007549728,\"predicate\":\"updateUserName\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"first_name\",\"type\":\"string\"},{\"name\":\"last_name\",\"type\":\"string\"},{\"name\":\"username\",\"type\":\"string\"}],\"type\":\"Update\"},{\"id\":-232290676,\"predicate\":\"updateUserPhoto\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"photo\",\"type\":\"UserProfilePhoto\"},{\"name\":\"previous\",\"type\":\"Bool\"}],\"type\":\"Update\"},{\"id\":314359194,\"predicate\":\"updateNewEncryptedMessage\",\"params\":[{\"name\":\"message\",\"type\":\"EncryptedMessage\"},{\"name\":\"qts\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":386986326,\"predicate\":\"updateEncryptedChatTyping\",\"params\":[{\"name\":\"chat_id\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-1264392051,\"predicate\":\"updateEncryption\",\"params\":[{\"name\":\"chat\",\"type\":\"EncryptedChat\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":956179895,\"predicate\":\"updateEncryptedMessagesRead\",\"params\":[{\"name\":\"chat_id\",\"type\":\"int\"},{\"name\":\"max_date\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":1037718609,\"predicate\":\"updateChatParticipantAdd\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"inviter_id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"version\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-483443337,\"predicate\":\"updateChatParticipantDelete\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"version\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-1906403213,\"predicate\":\"updateDcOptions\",\"params\":[{\"name\":\"dc_options\",\"type\":\"Vector<DcOption>\"}],\"type\":\"Update\"},{\"id\":-1094555409,\"predicate\":\"updateNotifySettings\",\"params\":[{\"name\":\"peer\",\"type\":\"NotifyPeer\"},{\"name\":\"notify_settings\",\"type\":\"PeerNotifySettings\"}],\"type\":\"Update\"},{\"id\":-337352679,\"predicate\":\"updateServiceNotification\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"popup\",\"type\":\"flags.0?true\"},{\"name\":\"inbox_date\",\"type\":\"flags.1?int\"},{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"media\",\"type\":\"MessageMedia\"},{\"name\":\"entities\",\"type\":\"Vector<MessageEntity>\"}],\"type\":\"Update\"},{\"id\":-298113238,\"predicate\":\"updatePrivacy\",\"params\":[{\"name\":\"key\",\"type\":\"PrivacyKey\"},{\"name\":\"rules\",\"type\":\"Vector<PrivacyRule>\"}],\"type\":\"Update\"},{\"id\":88680979,\"predicate\":\"updateUserPhone\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"phone\",\"type\":\"string\"}],\"type\":\"Update\"},{\"id\":-1667805217,\"predicate\":\"updateReadHistoryInbox\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"folder_id\",\"type\":\"flags.0?int\"},{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"max_id\",\"type\":\"int\"},{\"name\":\"still_unread_count\",\"type\":\"int\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":791617983,\"predicate\":\"updateReadHistoryOutbox\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"max_id\",\"type\":\"int\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":2139689491,\"predicate\":\"updateWebPage\",\"params\":[{\"name\":\"webpage\",\"type\":\"WebPage\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":1757493555,\"predicate\":\"updateReadMessagesContents\",\"params\":[{\"name\":\"messages\",\"type\":\"Vector<int>\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":277713951,\"predicate\":\"updateChannelTooLong\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"pts\",\"type\":\"flags.0?int\"}],\"type\":\"Update\"},{\"id\":1666927625,\"predicate\":\"updateChannel\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"}],\"type\":\"Update\"},{\"id\":1656358105,\"predicate\":\"updateNewChannelMessage\",\"params\":[{\"name\":\"message\",\"type\":\"Message\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-1842450928,\"predicate\":\"updateReadChannelInbox\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"folder_id\",\"type\":\"flags.0?int\"},{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"max_id\",\"type\":\"int\"},{\"name\":\"still_unread_count\",\"type\":\"int\"},{\"name\":\"pts\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-1020437742,\"predicate\":\"updateDeleteChannelMessages\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"messages\",\"type\":\"Vector<int>\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-232346616,\"predicate\":\"updateChannelMessageViews\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"views\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-674602590,\"predicate\":\"updateChatParticipantAdmin\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"is_admin\",\"type\":\"Bool\"},{\"name\":\"version\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":1753886890,\"predicate\":\"updateNewStickerSet\",\"params\":[{\"name\":\"stickerset\",\"type\":\"messages.StickerSet\"}],\"type\":\"Update\"},{\"id\":196268545,\"predicate\":\"updateStickerSetsOrder\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"masks\",\"type\":\"flags.0?true\"},{\"name\":\"order\",\"type\":\"Vector<long>\"}],\"type\":\"Update\"},{\"id\":1135492588,\"predicate\":\"updateStickerSets\",\"params\":[],\"type\":\"Update\"},{\"id\":-1821035490,\"predicate\":\"updateSavedGifs\",\"params\":[],\"type\":\"Update\"},{\"id\":1232025500,\"predicate\":\"updateBotInlineQuery\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"query\",\"type\":\"string\"},{\"name\":\"geo\",\"type\":\"flags.0?GeoPoint\"},{\"name\":\"peer_type\",\"type\":\"flags.1?InlineQueryPeerType\"},{\"name\":\"offset\",\"type\":\"string\"}],\"type\":\"Update\"},{\"id\":317794823,\"predicate\":\"updateBotInlineSend\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"query\",\"type\":\"string\"},{\"name\":\"geo\",\"type\":\"flags.0?GeoPoint\"},{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"msg_id\",\"type\":\"flags.1?InputBotInlineMessageID\"}],\"type\":\"Update\"},{\"id\":457133559,\"predicate\":\"updateEditChannelMessage\",\"params\":[{\"name\":\"message\",\"type\":\"Message\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-1177566067,\"predicate\":\"updateBotCallbackQuery\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"chat_instance\",\"type\":\"long\"},{\"name\":\"data\",\"type\":\"flags.0?bytes\"},{\"name\":\"game_short_name\",\"type\":\"flags.1?string\"}],\"type\":\"Update\"},{\"id\":-469536605,\"predicate\":\"updateEditMessage\",\"params\":[{\"name\":\"message\",\"type\":\"Message\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":1763610706,\"predicate\":\"updateInlineBotCallbackQuery\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"msg_id\",\"type\":\"InputBotInlineMessageID\"},{\"name\":\"chat_instance\",\"type\":\"long\"},{\"name\":\"data\",\"type\":\"flags.0?bytes\"},{\"name\":\"game_short_name\",\"type\":\"flags.1?string\"}],\"type\":\"Update\"},{\"id\":-1218471511,\"predicate\":\"updateReadChannelOutbox\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"max_id\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-299124375,\"predicate\":\"updateDraftMessage\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"draft\",\"type\":\"DraftMessage\"}],\"type\":\"Update\"},{\"id\":1461528386,\"predicate\":\"updateReadFeaturedStickers\",\"params\":[],\"type\":\"Update\"},{\"id\":-1706939360,\"predicate\":\"updateRecentStickers\",\"params\":[],\"type\":\"Update\"},{\"id\":-1574314746,\"predicate\":\"updateConfig\",\"params\":[],\"type\":\"Update\"},{\"id\":861169551,\"predicate\":\"updatePtsChanged\",\"params\":[],\"type\":\"Update\"},{\"id\":791390623,\"predicate\":\"updateChannelWebPage\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"webpage\",\"type\":\"WebPage\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":1852826908,\"predicate\":\"updateDialogPinned\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"pinned\",\"type\":\"flags.0?true\"},{\"name\":\"folder_id\",\"type\":\"flags.1?int\"},{\"name\":\"peer\",\"type\":\"DialogPeer\"}],\"type\":\"Update\"},{\"id\":-99664734,\"predicate\":\"updatePinnedDialogs\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"folder_id\",\"type\":\"flags.1?int\"},{\"name\":\"order\",\"type\":\"flags.0?Vector<DialogPeer>\"}],\"type\":\"Update\"},{\"id\":-2095595325,\"predicate\":\"updateBotWebhookJSON\",\"params\":[{\"name\":\"data\",\"type\":\"DataJSON\"}],\"type\":\"Update\"},{\"id\":-1684914010,\"predicate\":\"updateBotWebhookJSONQuery\",\"params\":[{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"data\",\"type\":\"DataJSON\"},{\"name\":\"timeout\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-1246823043,\"predicate\":\"updateBotShippingQuery\",\"params\":[{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"payload\",\"type\":\"bytes\"},{\"name\":\"shipping_address\",\"type\":\"PostAddress\"}],\"type\":\"Update\"},{\"id\":-1934976362,\"predicate\":\"updateBotPrecheckoutQuery\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"payload\",\"type\":\"bytes\"},{\"name\":\"info\",\"type\":\"flags.0?PaymentRequestedInfo\"},{\"name\":\"shipping_option_id\",\"type\":\"flags.1?string\"},{\"name\":\"currency\",\"type\":\"string\"},{\"name\":\"total_amount\",\"type\":\"long\"}],\"type\":\"Update\"},{\"id\":-1425052898,\"predicate\":\"updatePhoneCall\",\"params\":[{\"name\":\"phone_call\",\"type\":\"PhoneCall\"}],\"type\":\"Update\"},{\"id\":1180041828,\"predicate\":\"updateLangPackTooLong\",\"params\":[{\"name\":\"lang_code\",\"type\":\"string\"}],\"type\":\"Update\"},{\"id\":1442983757,\"predicate\":\"updateLangPack\",\"params\":[{\"name\":\"difference\",\"type\":\"LangPackDifference\"}],\"type\":\"Update\"},{\"id\":-451831443,\"predicate\":\"updateFavedStickers\",\"params\":[],\"type\":\"Update\"},{\"id\":1153291573,\"predicate\":\"updateChannelReadMessagesContents\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"messages\",\"type\":\"Vector<int>\"}],\"type\":\"Update\"},{\"id\":1887741886,\"predicate\":\"updateContactsReset\",\"params\":[],\"type\":\"Update\"},{\"id\":-1304443240,\"predicate\":\"updateChannelAvailableMessages\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"available_min_id\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-513517117,\"predicate\":\"updateDialogUnreadMark\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"unread\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"DialogPeer\"}],\"type\":\"Update\"},{\"id\":-1398708869,\"predicate\":\"updateMessagePoll\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"poll_id\",\"type\":\"long\"},{\"name\":\"poll\",\"type\":\"flags.0?Poll\"},{\"name\":\"results\",\"type\":\"PollResults\"}],\"type\":\"Update\"},{\"id\":1421875280,\"predicate\":\"updateChatDefaultBannedRights\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"default_banned_rights\",\"type\":\"ChatBannedRights\"},{\"name\":\"version\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":422972864,\"predicate\":\"updateFolderPeers\",\"params\":[{\"name\":\"folder_peers\",\"type\":\"Vector<FolderPeer>\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":1786671974,\"predicate\":\"updatePeerSettings\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"settings\",\"type\":\"PeerSettings\"}],\"type\":\"Update\"},{\"id\":-1263546448,\"predicate\":\"updatePeerLocated\",\"params\":[{\"name\":\"peers\",\"type\":\"Vector<PeerLocated>\"}],\"type\":\"Update\"},{\"id\":967122427,\"predicate\":\"updateNewScheduledMessage\",\"params\":[{\"name\":\"message\",\"type\":\"Message\"}],\"type\":\"Update\"},{\"id\":-1870238482,\"predicate\":\"updateDeleteScheduledMessages\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"messages\",\"type\":\"Vector<int>\"}],\"type\":\"Update\"},{\"id\":-2112423005,\"predicate\":\"updateTheme\",\"params\":[{\"name\":\"theme\",\"type\":\"Theme\"}],\"type\":\"Update\"},{\"id\":-2027964103,\"predicate\":\"updateGeoLiveViewed\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"msg_id\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":1448076945,\"predicate\":\"updateLoginToken\",\"params\":[],\"type\":\"Update\"},{\"id\":274961865,\"predicate\":\"updateMessagePollVote\",\"params\":[{\"name\":\"poll_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"options\",\"type\":\"Vector<bytes>\"},{\"name\":\"qts\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":654302845,\"predicate\":\"updateDialogFilter\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"filter\",\"type\":\"flags.0?DialogFilter\"}],\"type\":\"Update\"},{\"id\":-1512627963,\"predicate\":\"updateDialogFilterOrder\",\"params\":[{\"name\":\"order\",\"type\":\"Vector<int>\"}],\"type\":\"Update\"},{\"id\":889491791,\"predicate\":\"updateDialogFilters\",\"params\":[],\"type\":\"Update\"},{\"id\":643940105,\"predicate\":\"updatePhoneCallSignalingData\",\"params\":[{\"name\":\"phone_call_id\",\"type\":\"long\"},{\"name\":\"data\",\"type\":\"bytes\"}],\"type\":\"Update\"},{\"id\":-761649164,\"predicate\":\"updateChannelMessageForwards\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"forwards\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-693004986,\"predicate\":\"updateReadChannelDiscussionInbox\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"top_msg_id\",\"type\":\"int\"},{\"name\":\"read_max_id\",\"type\":\"int\"},{\"name\":\"broadcast_id\",\"type\":\"flags.0?long\"},{\"name\":\"broadcast_post\",\"type\":\"flags.0?int\"}],\"type\":\"Update\"},{\"id\":1767677564,\"predicate\":\"updateReadChannelDiscussionOutbox\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"top_msg_id\",\"type\":\"int\"},{\"name\":\"read_max_id\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":610945826,\"predicate\":\"updatePeerBlocked\",\"params\":[{\"name\":\"peer_id\",\"type\":\"Peer\"},{\"name\":\"blocked\",\"type\":\"Bool\"}],\"type\":\"Update\"},{\"id\":-1937192669,\"predicate\":\"updateChannelUserTyping\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"top_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"from_id\",\"type\":\"Peer\"},{\"name\":\"action\",\"type\":\"SendMessageAction\"}],\"type\":\"Update\"},{\"id\":-309990731,\"predicate\":\"updatePinnedMessages\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"pinned\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"messages\",\"type\":\"Vector<int>\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":1538885128,\"predicate\":\"updatePinnedChannelMessages\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"pinned\",\"type\":\"flags.0?true\"},{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"messages\",\"type\":\"Vector<int>\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-124097970,\"predicate\":\"updateChat\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"}],\"type\":\"Update\"},{\"id\":-219423922,\"predicate\":\"updateGroupCallParticipants\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"participants\",\"type\":\"Vector<GroupCallParticipant>\"},{\"name\":\"version\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":347227392,\"predicate\":\"updateGroupCall\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"call\",\"type\":\"GroupCall\"}],\"type\":\"Update\"},{\"id\":-1147422299,\"predicate\":\"updatePeerHistoryTTL\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"ttl_period\",\"type\":\"flags.0?int\"}],\"type\":\"Update\"},{\"id\":-796432838,\"predicate\":\"updateChatParticipant\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"actor_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"prev_participant\",\"type\":\"flags.0?ChatParticipant\"},{\"name\":\"new_participant\",\"type\":\"flags.1?ChatParticipant\"},{\"name\":\"invite\",\"type\":\"flags.2?ExportedChatInvite\"},{\"name\":\"qts\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-1738720581,\"predicate\":\"updateChannelParticipant\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"actor_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"prev_participant\",\"type\":\"flags.0?ChannelParticipant\"},{\"name\":\"new_participant\",\"type\":\"flags.1?ChannelParticipant\"},{\"name\":\"invite\",\"type\":\"flags.2?ExportedChatInvite\"},{\"name\":\"qts\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-997782967,\"predicate\":\"updateBotStopped\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"stopped\",\"type\":\"Bool\"},{\"name\":\"qts\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":192428418,\"predicate\":\"updateGroupCallConnection\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"presentation\",\"type\":\"flags.0?true\"},{\"name\":\"params\",\"type\":\"DataJSON\"}],\"type\":\"Update\"},{\"id\":1299263278,\"predicate\":\"updateBotCommands\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"bot_id\",\"type\":\"long\"},{\"name\":\"commands\",\"type\":\"Vector<BotCommand>\"}],\"type\":\"Update\"},{\"id\":1885586395,\"predicate\":\"updatePendingJoinRequests\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"requests_pending\",\"type\":\"int\"},{\"name\":\"recent_requesters\",\"type\":\"Vector<long>\"}],\"type\":\"Update\"},{\"id\":299870598,\"predicate\":\"updateBotChatInviteRequester\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"about\",\"type\":\"string\"},{\"name\":\"invite\",\"type\":\"ExportedChatInvite\"},{\"name\":\"qts\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":357013699,\"predicate\":\"updateMessageReactions\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"reactions\",\"type\":\"MessageReactions\"}],\"type\":\"Update\"},{\"id\":-1519637954,\"predicate\":\"updates.state\",\"params\":[{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"qts\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"seq\",\"type\":\"int\"},{\"name\":\"unread_count\",\"type\":\"int\"}],\"type\":\"updates.State\"},{\"id\":1567990072,\"predicate\":\"updates.differenceEmpty\",\"params\":[{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"seq\",\"type\":\"int\"}],\"type\":\"updates.Difference\"},{\"id\":16030880,\"predicate\":\"updates.difference\",\"params\":[{\"name\":\"new_messages\",\"type\":\"Vector<Message>\"},{\"name\":\"new_encrypted_messages\",\"type\":\"Vector<EncryptedMessage>\"},{\"name\":\"other_updates\",\"type\":\"Vector<Update>\"},{\"name\":\"chats\",\"type\":\"Vector<Chat>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"},{\"name\":\"state\",\"type\":\"updates.State\"}],\"type\":\"updates.Difference\"},{\"id\":-1459938943,\"predicate\":\"updates.differenceSlice\",\"params\":[{\"name\":\"new_messages\",\"type\":\"Vector<Message>\"},{\"name\":\"new_encrypted_messages\",\"type\":\"Vector<EncryptedMessage>\"},{\"name\":\"other_updates\",\"type\":\"Vector<Update>\"},{\"name\":\"chats\",\"type\":\"Vector<Chat>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"},{\"name\":\"intermediate_state\",\"type\":\"updates.State\"}],\"type\":\"updates.Difference\"},{\"id\":1258196845,\"predicate\":\"updates.differenceTooLong\",\"params\":[{\"name\":\"pts\",\"type\":\"int\"}],\"type\":\"updates.Difference\"},{\"id\":-484987010,\"predicate\":\"updatesTooLong\",\"params\":[],\"type\":\"Updates\"},{\"id\":826001400,\"predicate\":\"updateShortMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"out\",\"type\":\"flags.1?true\"},{\"name\":\"mentioned\",\"type\":\"flags.4?true\"},{\"name\":\"media_unread\",\"type\":\"flags.5?true\"},{\"name\":\"silent\",\"type\":\"flags.13?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"fwd_from\",\"type\":\"flags.2?MessageFwdHeader\"},{\"name\":\"via_bot_id\",\"type\":\"flags.11?long\"},{\"name\":\"reply_to\",\"type\":\"flags.3?MessageReplyHeader\"},{\"name\":\"entities\",\"type\":\"flags.7?Vector<MessageEntity>\"},{\"name\":\"ttl_period\",\"type\":\"flags.25?int\"}],\"type\":\"Updates\"},{\"id\":1299050149,\"predicate\":\"updateShortChatMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"out\",\"type\":\"flags.1?true\"},{\"name\":\"mentioned\",\"type\":\"flags.4?true\"},{\"name\":\"media_unread\",\"type\":\"flags.5?true\"},{\"name\":\"silent\",\"type\":\"flags.13?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"from_id\",\"type\":\"long\"},{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"fwd_from\",\"type\":\"flags.2?MessageFwdHeader\"},{\"name\":\"via_bot_id\",\"type\":\"flags.11?long\"},{\"name\":\"reply_to\",\"type\":\"flags.3?MessageReplyHeader\"},{\"name\":\"entities\",\"type\":\"flags.7?Vector<MessageEntity>\"},{\"name\":\"ttl_period\",\"type\":\"flags.25?int\"}],\"type\":\"Updates\"},{\"id\":2027216577,\"predicate\":\"updateShort\",\"params\":[{\"name\":\"update\",\"type\":\"Update\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":1918567619,\"predicate\":\"updatesCombined\",\"params\":[{\"name\":\"updates\",\"type\":\"Vector<Update>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"},{\"name\":\"chats\",\"type\":\"Vector<Chat>\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"seq_start\",\"type\":\"int\"},{\"name\":\"seq\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":1957577280,\"predicate\":\"updates\",\"params\":[{\"name\":\"updates\",\"type\":\"Vector<Update>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"},{\"name\":\"chats\",\"type\":\"Vector<Chat>\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"seq\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":-1877614335,\"predicate\":\"updateShortSentMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"out\",\"type\":\"flags.1?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"media\",\"type\":\"flags.9?MessageMedia\"},{\"name\":\"entities\",\"type\":\"flags.7?Vector<MessageEntity>\"},{\"name\":\"ttl_period\",\"type\":\"flags.25?int\"}],\"type\":\"Updates\"},{\"id\":-1916114267,\"predicate\":\"photos.photos\",\"params\":[{\"name\":\"photos\",\"type\":\"Vector<Photo>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"photos.Photos\"},{\"id\":352657236,\"predicate\":\"photos.photosSlice\",\"params\":[{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"photos\",\"type\":\"Vector<Photo>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"photos.Photos\"},{\"id\":539045032,\"predicate\":\"photos.photo\",\"params\":[{\"name\":\"photo\",\"type\":\"Photo\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"photos.Photo\"},{\"id\":157948117,\"predicate\":\"upload.file\",\"params\":[{\"name\":\"type\",\"type\":\"storage.FileType\"},{\"name\":\"mtime\",\"type\":\"int\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"upload.File\"},{\"id\":-242427324,\"predicate\":\"upload.fileCdnRedirect\",\"params\":[{\"name\":\"dc_id\",\"type\":\"int\"},{\"name\":\"file_token\",\"type\":\"bytes\"},{\"name\":\"encryption_key\",\"type\":\"bytes\"},{\"name\":\"encryption_iv\",\"type\":\"bytes\"},{\"name\":\"file_hashes\",\"type\":\"Vector<FileHash>\"}],\"type\":\"upload.File\"},{\"id\":414687501,\"predicate\":\"dcOption\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"ipv6\",\"type\":\"flags.0?true\"},{\"name\":\"media_only\",\"type\":\"flags.1?true\"},{\"name\":\"tcpo_only\",\"type\":\"flags.2?true\"},{\"name\":\"cdn\",\"type\":\"flags.3?true\"},{\"name\":\"static\",\"type\":\"flags.4?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"ip_address\",\"type\":\"string\"},{\"name\":\"port\",\"type\":\"int\"},{\"name\":\"secret\",\"type\":\"flags.10?bytes\"}],\"type\":\"DcOption\"},{\"id\":856375399,\"predicate\":\"config\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"phonecalls_enabled\",\"type\":\"flags.1?true\"},{\"name\":\"default_p2p_contacts\",\"type\":\"flags.3?true\"},{\"name\":\"preload_featured_stickers\",\"type\":\"flags.4?true\"},{\"name\":\"ignore_phone_entities\",\"type\":\"flags.5?true\"},{\"name\":\"revoke_pm_inbox\",\"type\":\"flags.6?true\"},{\"name\":\"blocked_mode\",\"type\":\"flags.8?true\"},{\"name\":\"pfs_enabled\",\"type\":\"flags.13?true\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"expires\",\"type\":\"int\"},{\"name\":\"test_mode\",\"type\":\"Bool\"},{\"name\":\"this_dc\",\"type\":\"int\"},{\"name\":\"dc_options\",\"type\":\"Vector<DcOption>\"},{\"name\":\"dc_txt_domain_name\",\"type\":\"string\"},{\"name\":\"chat_size_max\",\"type\":\"int\"},{\"name\":\"megagroup_size_max\",\"type\":\"int\"},{\"name\":\"forwarded_count_max\",\"type\":\"int\"},{\"name\":\"online_update_period_ms\",\"type\":\"int\"},{\"name\":\"offline_blur_timeout_ms\",\"type\":\"int\"},{\"name\":\"offline_idle_timeout_ms\",\"type\":\"int\"},{\"name\":\"online_cloud_timeout_ms\",\"type\":\"int\"},{\"name\":\"notify_cloud_delay_ms\",\"type\":\"int\"},{\"name\":\"notify_default_delay_ms\",\"type\":\"int\"},{\"name\":\"push_chat_period_ms\",\"type\":\"int\"},{\"name\":\"push_chat_limit\",\"type\":\"int\"},{\"name\":\"saved_gifs_limit\",\"type\":\"int\"},{\"name\":\"edit_time_limit\",\"type\":\"int\"},{\"name\":\"revoke_time_limit\",\"type\":\"int\"},{\"name\":\"revoke_pm_time_limit\",\"type\":\"int\"},{\"name\":\"rating_e_decay\",\"type\":\"int\"},{\"name\":\"stickers_recent_limit\",\"type\":\"int\"},{\"name\":\"stickers_faved_limit\",\"type\":\"int\"},{\"name\":\"channels_read_media_period\",\"type\":\"int\"},{\"name\":\"tmp_sessions\",\"type\":\"flags.0?int\"},{\"name\":\"pinned_dialogs_count_max\",\"type\":\"int\"},{\"name\":\"pinned_infolder_count_max\",\"type\":\"int\"},{\"name\":\"call_receive_timeout_ms\",\"type\":\"int\"},{\"name\":\"call_ring_timeout_ms\",\"type\":\"int\"},{\"name\":\"call_connect_timeout_ms\",\"type\":\"int\"},{\"name\":\"call_packet_timeout_ms\",\"type\":\"int\"},{\"name\":\"me_url_prefix\",\"type\":\"string\"},{\"name\":\"autoupdate_url_prefix\",\"type\":\"flags.7?string\"},{\"name\":\"gif_search_username\",\"type\":\"flags.9?string\"},{\"name\":\"venue_search_username\",\"type\":\"flags.10?string\"},{\"name\":\"img_search_username\",\"type\":\"flags.11?string\"},{\"name\":\"static_maps_provider\",\"type\":\"flags.12?string\"},{\"name\":\"caption_length_max\",\"type\":\"int\"},{\"name\":\"message_length_max\",\"type\":\"int\"},{\"name\":\"webfile_dc_id\",\"type\":\"int\"},{\"name\":\"suggested_lang_code\",\"type\":\"flags.2?string\"},{\"name\":\"lang_pack_version\",\"type\":\"flags.2?int\"},{\"name\":\"base_lang_pack_version\",\"type\":\"flags.2?int\"}],\"type\":\"Config\"},{\"id\":-1910892683,\"predicate\":\"nearestDc\",\"params\":[{\"name\":\"country\",\"type\":\"string\"},{\"name\":\"this_dc\",\"type\":\"int\"},{\"name\":\"nearest_dc\",\"type\":\"int\"}],\"type\":\"NearestDc\"},{\"id\":-860107216,\"predicate\":\"help.appUpdate\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"can_not_skip\",\"type\":\"flags.0?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"version\",\"type\":\"string\"},{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"Vector<MessageEntity>\"},{\"name\":\"document\",\"type\":\"flags.1?Document\"},{\"name\":\"url\",\"type\":\"flags.2?string\"},{\"name\":\"sticker\",\"type\":\"flags.3?Document\"}],\"type\":\"help.AppUpdate\"},{\"id\":-1000708810,\"predicate\":\"help.noAppUpdate\",\"params\":[],\"type\":\"help.AppUpdate\"},{\"id\":415997816,\"predicate\":\"help.inviteText\",\"params\":[{\"name\":\"message\",\"type\":\"string\"}],\"type\":\"help.InviteText\"},{\"id\":-1417756512,\"predicate\":\"encryptedChatEmpty\",\"params\":[{\"name\":\"id\",\"type\":\"int\"}],\"type\":\"EncryptedChat\"},{\"id\":1722964307,\"predicate\":\"encryptedChatWaiting\",\"params\":[{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"admin_id\",\"type\":\"long\"},{\"name\":\"participant_id\",\"type\":\"long\"}],\"type\":\"EncryptedChat\"},{\"id\":1223809356,\"predicate\":\"encryptedChatRequested\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"folder_id\",\"type\":\"flags.0?int\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"admin_id\",\"type\":\"long\"},{\"name\":\"participant_id\",\"type\":\"long\"},{\"name\":\"g_a\",\"type\":\"bytes\"}],\"type\":\"EncryptedChat\"},{\"id\":1643173063,\"predicate\":\"encryptedChat\",\"params\":[{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"admin_id\",\"type\":\"long\"},{\"name\":\"participant_id\",\"type\":\"long\"},{\"name\":\"g_a_or_b\",\"type\":\"bytes\"},{\"name\":\"key_fingerprint\",\"type\":\"long\"}],\"type\":\"EncryptedChat\"},{\"id\":505183301,\"predicate\":\"encryptedChatDiscarded\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"history_deleted\",\"type\":\"flags.0?true\"},{\"name\":\"id\",\"type\":\"int\"}],\"type\":\"EncryptedChat\"},{\"id\":-247351839,\"predicate\":\"inputEncryptedChat\",\"params\":[{\"name\":\"chat_id\",\"type\":\"int\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputEncryptedChat\"},{\"id\":-1038136962,\"predicate\":\"encryptedFileEmpty\",\"params\":[],\"type\":\"EncryptedFile\"},{\"id\":1248893260,\"predicate\":\"encryptedFile\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"size\",\"type\":\"int\"},{\"name\":\"dc_id\",\"type\":\"int\"},{\"name\":\"key_fingerprint\",\"type\":\"int\"}],\"type\":\"EncryptedFile\"},{\"id\":406307684,\"predicate\":\"inputEncryptedFileEmpty\",\"params\":[],\"type\":\"InputEncryptedFile\"},{\"id\":1690108678,\"predicate\":\"inputEncryptedFileUploaded\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"parts\",\"type\":\"int\"},{\"name\":\"md5_checksum\",\"type\":\"string\"},{\"name\":\"key_fingerprint\",\"type\":\"int\"}],\"type\":\"InputEncryptedFile\"},{\"id\":1511503333,\"predicate\":\"inputEncryptedFile\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputEncryptedFile\"},{\"id\":767652808,\"predicate\":\"inputEncryptedFileBigUploaded\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"parts\",\"type\":\"int\"},{\"name\":\"key_fingerprint\",\"type\":\"int\"}],\"type\":\"InputEncryptedFile\"},{\"id\":-317144808,\"predicate\":\"encryptedMessage\",\"params\":[{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"chat_id\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"bytes\",\"type\":\"bytes\"},{\"name\":\"file\",\"type\":\"EncryptedFile\"}],\"type\":\"EncryptedMessage\"},{\"id\":594758406,\"predicate\":\"encryptedMessageService\",\"params\":[{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"chat_id\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"EncryptedMessage\"},{\"id\":-1058912715,\"predicate\":\"messages.dhConfigNotModified\",\"params\":[{\"name\":\"random\",\"type\":\"bytes\"}],\"type\":\"messages.DhConfig\"},{\"id\":740433629,\"predicate\":\"messages.dhConfig\",\"params\":[{\"name\":\"g\",\"type\":\"int\"},{\"name\":\"p\",\"type\":\"bytes\"},{\"name\":\"version\",\"type\":\"int\"},{\"name\":\"random\",\"type\":\"bytes\"}],\"type\":\"messages.DhConfig\"},{\"id\":1443858741,\"predicate\":\"messages.sentEncryptedMessage\",\"params\":[{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"messages.SentEncryptedMessage\"},{\"id\":-1802240206,\"predicate\":\"messages.sentEncryptedFile\",\"params\":[{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"file\",\"type\":\"EncryptedFile\"}],\"type\":\"messages.SentEncryptedMessage\"},{\"id\":1928391342,\"predicate\":\"inputDocumentEmpty\",\"params\":[],\"type\":\"InputDocument\"},{\"id\":448771445,\"predicate\":\"inputDocument\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"file_reference\",\"type\":\"bytes\"}],\"type\":\"InputDocument\"},{\"id\":922273905,\"predicate\":\"documentEmpty\",\"params\":[{\"name\":\"id\",\"type\":\"long\"}],\"type\":\"Document\"},{\"id\":512177195,\"predicate\":\"document\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"file_reference\",\"type\":\"bytes\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"mime_type\",\"type\":\"string\"},{\"name\":\"size\",\"type\":\"int\"},{\"name\":\"thumbs\",\"type\":\"flags.0?Vector<PhotoSize>\"},{\"name\":\"video_thumbs\",\"type\":\"flags.1?Vector<VideoSize>\"},{\"name\":\"dc_id\",\"type\":\"int\"},{\"name\":\"attributes\",\"type\":\"Vector<DocumentAttribute>\"}],\"type\":\"Document\"},{\"id\":398898678,\"predicate\":\"help.support\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"user\",\"type\":\"User\"}],\"type\":\"help.Support\"},{\"id\":-1613493288,\"predicate\":\"notifyPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"}],\"type\":\"NotifyPeer\"},{\"id\":-1261946036,\"predicate\":\"notifyUsers\",\"params\":[],\"type\":\"NotifyPeer\"},{\"id\":-1073230141,\"predicate\":\"notifyChats\",\"params\":[],\"type\":\"NotifyPeer\"},{\"id\":-703403793,\"predicate\":\"notifyBroadcasts\",\"params\":[],\"type\":\"NotifyPeer\"},{\"id\":381645902,\"predicate\":\"sendMessageTypingAction\",\"params\":[],\"type\":\"SendMessageAction\"},{\"id\":-44119819,\"predicate\":\"sendMessageCancelAction\",\"params\":[],\"type\":\"SendMessageAction\"},{\"id\":-1584933265,\"predicate\":\"sendMessageRecordVideoAction\",\"params\":[],\"type\":\"SendMessageAction\"},{\"id\":-378127636,\"predicate\":\"sendMessageUploadVideoAction\",\"params\":[{\"name\":\"progress\",\"type\":\"int\"}],\"type\":\"SendMessageAction\"},{\"id\":-718310409,\"predicate\":\"sendMessageRecordAudioAction\",\"params\":[],\"type\":\"SendMessageAction\"},{\"id\":-212740181,\"predicate\":\"sendMessageUploadAudioAction\",\"params\":[{\"name\":\"progress\",\"type\":\"int\"}],\"type\":\"SendMessageAction\"},{\"id\":-774682074,\"predicate\":\"sendMessageUploadPhotoAction\",\"params\":[{\"name\":\"progress\",\"type\":\"int\"}],\"type\":\"SendMessageAction\"},{\"id\":-1441998364,\"predicate\":\"sendMessageUploadDocumentAction\",\"params\":[{\"name\":\"progress\",\"type\":\"int\"}],\"type\":\"SendMessageAction\"},{\"id\":393186209,\"predicate\":\"sendMessageGeoLocationAction\",\"params\":[],\"type\":\"SendMessageAction\"},{\"id\":1653390447,\"predicate\":\"sendMessageChooseContactAction\",\"params\":[],\"type\":\"SendMessageAction\"},{\"id\":-580219064,\"predicate\":\"sendMessageGamePlayAction\",\"params\":[],\"type\":\"SendMessageAction\"},{\"id\":-1997373508,\"predicate\":\"sendMessageRecordRoundAction\",\"params\":[],\"type\":\"SendMessageAction\"},{\"id\":608050278,\"predicate\":\"sendMessageUploadRoundAction\",\"params\":[{\"name\":\"progress\",\"type\":\"int\"}],\"type\":\"SendMessageAction\"},{\"id\":-651419003,\"predicate\":\"speakingInGroupCallAction\",\"params\":[],\"type\":\"SendMessageAction\"},{\"id\":-606432698,\"predicate\":\"sendMessageHistoryImportAction\",\"params\":[{\"name\":\"progress\",\"type\":\"int\"}],\"type\":\"SendMessageAction\"},{\"id\":-1336228175,\"predicate\":\"sendMessageChooseStickerAction\",\"params\":[],\"type\":\"SendMessageAction\"},{\"id\":630664139,\"predicate\":\"sendMessageEmojiInteraction\",\"params\":[{\"name\":\"emoticon\",\"type\":\"string\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"interaction\",\"type\":\"DataJSON\"}],\"type\":\"SendMessageAction\"},{\"id\":-1234857938,\"predicate\":\"sendMessageEmojiInteractionSeen\",\"params\":[{\"name\":\"emoticon\",\"type\":\"string\"}],\"type\":\"SendMessageAction\"},{\"id\":-1290580579,\"predicate\":\"contacts.found\",\"params\":[{\"name\":\"my_results\",\"type\":\"Vector<Peer>\"},{\"name\":\"results\",\"type\":\"Vector<Peer>\"},{\"name\":\"chats\",\"type\":\"Vector<Chat>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"contacts.Found\"},{\"id\":1335282456,\"predicate\":\"inputPrivacyKeyStatusTimestamp\",\"params\":[],\"type\":\"InputPrivacyKey\"},{\"id\":-1107622874,\"predicate\":\"inputPrivacyKeyChatInvite\",\"params\":[],\"type\":\"InputPrivacyKey\"},{\"id\":-88417185,\"predicate\":\"inputPrivacyKeyPhoneCall\",\"params\":[],\"type\":\"InputPrivacyKey\"},{\"id\":-610373422,\"predicate\":\"inputPrivacyKeyPhoneP2P\",\"params\":[],\"type\":\"InputPrivacyKey\"},{\"id\":-1529000952,\"predicate\":\"inputPrivacyKeyForwards\",\"params\":[],\"type\":\"InputPrivacyKey\"},{\"id\":1461304012,\"predicate\":\"inputPrivacyKeyProfilePhoto\",\"params\":[],\"type\":\"InputPrivacyKey\"},{\"id\":55761658,\"predicate\":\"inputPrivacyKeyPhoneNumber\",\"params\":[],\"type\":\"InputPrivacyKey\"},{\"id\":-786326563,\"predicate\":\"inputPrivacyKeyAddedByPhone\",\"params\":[],\"type\":\"InputPrivacyKey\"},{\"id\":-1137792208,\"predicate\":\"privacyKeyStatusTimestamp\",\"params\":[],\"type\":\"PrivacyKey\"},{\"id\":1343122938,\"predicate\":\"privacyKeyChatInvite\",\"params\":[],\"type\":\"PrivacyKey\"},{\"id\":1030105979,\"predicate\":\"privacyKeyPhoneCall\",\"params\":[],\"type\":\"PrivacyKey\"},{\"id\":961092808,\"predicate\":\"privacyKeyPhoneP2P\",\"params\":[],\"type\":\"PrivacyKey\"},{\"id\":1777096355,\"predicate\":\"privacyKeyForwards\",\"params\":[],\"type\":\"PrivacyKey\"},{\"id\":-1777000467,\"predicate\":\"privacyKeyProfilePhoto\",\"params\":[],\"type\":\"PrivacyKey\"},{\"id\":-778378131,\"predicate\":\"privacyKeyPhoneNumber\",\"params\":[],\"type\":\"PrivacyKey\"},{\"id\":1124062251,\"predicate\":\"privacyKeyAddedByPhone\",\"params\":[],\"type\":\"PrivacyKey\"},{\"id\":218751099,\"predicate\":\"inputPrivacyValueAllowContacts\",\"params\":[],\"type\":\"InputPrivacyRule\"},{\"id\":407582158,\"predicate\":\"inputPrivacyValueAllowAll\",\"params\":[],\"type\":\"InputPrivacyRule\"},{\"id\":320652927,\"predicate\":\"inputPrivacyValueAllowUsers\",\"params\":[{\"name\":\"users\",\"type\":\"Vector<InputUser>\"}],\"type\":\"InputPrivacyRule\"},{\"id\":195371015,\"predicate\":\"inputPrivacyValueDisallowContacts\",\"params\":[],\"type\":\"InputPrivacyRule\"},{\"id\":-697604407,\"predicate\":\"inputPrivacyValueDisallowAll\",\"params\":[],\"type\":\"InputPrivacyRule\"},{\"id\":-1877932953,\"predicate\":\"inputPrivacyValueDisallowUsers\",\"params\":[{\"name\":\"users\",\"type\":\"Vector<InputUser>\"}],\"type\":\"InputPrivacyRule\"},{\"id\":-2079962673,\"predicate\":\"inputPrivacyValueAllowChatParticipants\",\"params\":[{\"name\":\"chats\",\"type\":\"Vector<long>\"}],\"type\":\"InputPrivacyRule\"},{\"id\":-380694650,\"predicate\":\"inputPrivacyValueDisallowChatParticipants\",\"params\":[{\"name\":\"chats\",\"type\":\"Vector<long>\"}],\"type\":\"InputPrivacyRule\"},{\"id\":-123988,\"predicate\":\"privacyValueAllowContacts\",\"params\":[],\"type\":\"PrivacyRule\"},{\"id\":1698855810,\"predicate\":\"privacyValueAllowAll\",\"params\":[],\"type\":\"PrivacyRule\"},{\"id\":-1198497870,\"predicate\":\"privacyValueAllowUsers\",\"params\":[{\"name\":\"users\",\"type\":\"Vector<long>\"}],\"type\":\"PrivacyRule\"},{\"id\":-125240806,\"predicate\":\"privacyValueDisallowContacts\",\"params\":[],\"type\":\"PrivacyRule\"},{\"id\":-1955338397,\"predicate\":\"privacyValueDisallowAll\",\"params\":[],\"type\":\"PrivacyRule\"},{\"id\":-463335103,\"predicate\":\"privacyValueDisallowUsers\",\"params\":[{\"name\":\"users\",\"type\":\"Vector<long>\"}],\"type\":\"PrivacyRule\"},{\"id\":1796427406,\"predicate\":\"privacyValueAllowChatParticipants\",\"params\":[{\"name\":\"chats\",\"type\":\"Vector<long>\"}],\"type\":\"PrivacyRule\"},{\"id\":1103656293,\"predicate\":\"privacyValueDisallowChatParticipants\",\"params\":[{\"name\":\"chats\",\"type\":\"Vector<long>\"}],\"type\":\"PrivacyRule\"},{\"id\":1352683077,\"predicate\":\"account.privacyRules\",\"params\":[{\"name\":\"rules\",\"type\":\"Vector<PrivacyRule>\"},{\"name\":\"chats\",\"type\":\"Vector<Chat>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"account.PrivacyRules\"},{\"id\":-1194283041,\"predicate\":\"accountDaysTTL\",\"params\":[{\"name\":\"days\",\"type\":\"int\"}],\"type\":\"AccountDaysTTL\"},{\"id\":1815593308,\"predicate\":\"documentAttributeImageSize\",\"params\":[{\"name\":\"w\",\"type\":\"int\"},{\"name\":\"h\",\"type\":\"int\"}],\"type\":\"DocumentAttribute\"},{\"id\":297109817,\"predicate\":\"documentAttributeAnimated\",\"params\":[],\"type\":\"DocumentAttribute\"},{\"id\":1662637586,\"predicate\":\"documentAttributeSticker\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"mask\",\"type\":\"flags.1?true\"},{\"name\":\"alt\",\"type\":\"string\"},{\"name\":\"stickerset\",\"type\":\"InputStickerSet\"},{\"name\":\"mask_coords\",\"type\":\"flags.0?MaskCoords\"}],\"type\":\"DocumentAttribute\"},{\"id\":250621158,\"predicate\":\"documentAttributeVideo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"round_message\",\"type\":\"flags.0?true\"},{\"name\":\"supports_streaming\",\"type\":\"flags.1?true\"},{\"name\":\"duration\",\"type\":\"int\"},{\"name\":\"w\",\"type\":\"int\"},{\"name\":\"h\",\"type\":\"int\"}],\"type\":\"DocumentAttribute\"},{\"id\":-1739392570,\"predicate\":\"documentAttributeAudio\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"voice\",\"type\":\"flags.10?true\"},{\"name\":\"duration\",\"type\":\"int\"},{\"name\":\"title\",\"type\":\"flags.0?string\"},{\"name\":\"performer\",\"type\":\"flags.1?string\"},{\"name\":\"waveform\",\"type\":\"flags.2?bytes\"}],\"type\":\"DocumentAttribute\"},{\"id\":358154344,\"predicate\":\"documentAttributeFilename\",\"params\":[{\"name\":\"file_name\",\"type\":\"string\"}],\"type\":\"DocumentAttribute\"},{\"id\":-1744710921,\"predicate\":\"documentAttributeHasStickers\",\"params\":[],\"type\":\"DocumentAttribute\"},{\"id\":-244016606,\"predicate\":\"messages.stickersNotModified\",\"params\":[],\"type\":\"messages.Stickers\"},{\"id\":816245886,\"predicate\":\"messages.stickers\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"stickers\",\"type\":\"Vector<Document>\"}],\"type\":\"messages.Stickers\"},{\"id\":313694676,\"predicate\":\"stickerPack\",\"params\":[{\"name\":\"emoticon\",\"type\":\"string\"},{\"name\":\"documents\",\"type\":\"Vector<long>\"}],\"type\":\"StickerPack\"},{\"id\":-395967805,\"predicate\":\"messages.allStickersNotModified\",\"params\":[],\"type\":\"messages.AllStickers\"},{\"id\":-843329861,\"predicate\":\"messages.allStickers\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"sets\",\"type\":\"Vector<StickerSet>\"}],\"type\":\"messages.AllStickers\"},{\"id\":-2066640507,\"predicate\":\"messages.affectedMessages\",\"params\":[{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"messages.AffectedMessages\"},{\"id\":-350980120,\"predicate\":\"webPageEmpty\",\"params\":[{\"name\":\"id\",\"type\":\"long\"}],\"type\":\"WebPage\"},{\"id\":-981018084,\"predicate\":\"webPagePending\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"WebPage\"},{\"id\":-392411726,\"predicate\":\"webPage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"display_url\",\"type\":\"string\"},{\"name\":\"hash\",\"type\":\"int\"},{\"name\":\"type\",\"type\":\"flags.0?string\"},{\"name\":\"site_name\",\"type\":\"flags.1?string\"},{\"name\":\"title\",\"type\":\"flags.2?string\"},{\"name\":\"description\",\"type\":\"flags.3?string\"},{\"name\":\"photo\",\"type\":\"flags.4?Photo\"},{\"name\":\"embed_url\",\"type\":\"flags.5?string\"},{\"name\":\"embed_type\",\"type\":\"flags.5?string\"},{\"name\":\"embed_width\",\"type\":\"flags.6?int\"},{\"name\":\"embed_height\",\"type\":\"flags.6?int\"},{\"name\":\"duration\",\"type\":\"flags.7?int\"},{\"name\":\"author\",\"type\":\"flags.8?string\"},{\"name\":\"document\",\"type\":\"flags.9?Document\"},{\"name\":\"cached_page\",\"type\":\"flags.10?Page\"},{\"name\":\"attributes\",\"type\":\"flags.12?Vector<WebPageAttribute>\"}],\"type\":\"WebPage\"},{\"id\":1930545681,\"predicate\":\"webPageNotModified\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"cached_page_views\",\"type\":\"flags.0?int\"}],\"type\":\"WebPage\"},{\"id\":-1392388579,\"predicate\":\"authorization\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"current\",\"type\":\"flags.0?true\"},{\"name\":\"official_app\",\"type\":\"flags.1?true\"},{\"name\":\"password_pending\",\"type\":\"flags.2?true\"},{\"name\":\"encrypted_requests_disabled\",\"type\":\"flags.3?true\"},{\"name\":\"call_requests_disabled\",\"type\":\"flags.4?true\"},{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"device_model\",\"type\":\"string\"},{\"name\":\"platform\",\"type\":\"string\"},{\"name\":\"system_version\",\"type\":\"string\"},{\"name\":\"api_id\",\"type\":\"int\"},{\"name\":\"app_name\",\"type\":\"string\"},{\"name\":\"app_version\",\"type\":\"string\"},{\"name\":\"date_created\",\"type\":\"int\"},{\"name\":\"date_active\",\"type\":\"int\"},{\"name\":\"ip\",\"type\":\"string\"},{\"name\":\"country\",\"type\":\"string\"},{\"name\":\"region\",\"type\":\"string\"}],\"type\":\"Authorization\"},{\"id\":1275039392,\"predicate\":\"account.authorizations\",\"params\":[{\"name\":\"authorization_ttl_days\",\"type\":\"int\"},{\"name\":\"authorizations\",\"type\":\"Vector<Authorization>\"}],\"type\":\"account.Authorizations\"},{\"id\":408623183,\"predicate\":\"account.password\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"has_recovery\",\"type\":\"flags.0?true\"},{\"name\":\"has_secure_values\",\"type\":\"flags.1?true\"},{\"name\":\"has_password\",\"type\":\"flags.2?true\"},{\"name\":\"current_algo\",\"type\":\"flags.2?PasswordKdfAlgo\"},{\"name\":\"srp_B\",\"type\":\"flags.2?bytes\"},{\"name\":\"srp_id\",\"type\":\"flags.2?long\"},{\"name\":\"hint\",\"type\":\"flags.3?string\"},{\"name\":\"email_unconfirmed_pattern\",\"type\":\"flags.4?string\"},{\"name\":\"new_algo\",\"type\":\"PasswordKdfAlgo\"},{\"name\":\"new_secure_algo\",\"type\":\"SecurePasswordKdfAlgo\"},{\"name\":\"secure_random\",\"type\":\"bytes\"},{\"name\":\"pending_reset_date\",\"type\":\"flags.5?int\"}],\"type\":\"account.Password\"},{\"id\":-1705233435,\"predicate\":\"account.passwordSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"email\",\"type\":\"flags.0?string\"},{\"name\":\"secure_settings\",\"type\":\"flags.1?SecureSecretSettings\"}],\"type\":\"account.PasswordSettings\"},{\"id\":-1036572727,\"predicate\":\"account.passwordInputSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"new_algo\",\"type\":\"flags.0?PasswordKdfAlgo\"},{\"name\":\"new_password_hash\",\"type\":\"flags.0?bytes\"},{\"name\":\"hint\",\"type\":\"flags.0?string\"},{\"name\":\"email\",\"type\":\"flags.1?string\"},{\"name\":\"new_secure_settings\",\"type\":\"flags.2?SecureSecretSettings\"}],\"type\":\"account.PasswordInputSettings\"},{\"id\":326715557,\"predicate\":\"auth.passwordRecovery\",\"params\":[{\"name\":\"email_pattern\",\"type\":\"string\"}],\"type\":\"auth.PasswordRecovery\"},{\"id\":-1551583367,\"predicate\":\"receivedNotifyMessage\",\"params\":[{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"flags\",\"type\":\"int\"}],\"type\":\"ReceivedNotifyMessage\"},{\"id\":179611673,\"predicate\":\"chatInviteExported\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"revoked\",\"type\":\"flags.0?true\"},{\"name\":\"permanent\",\"type\":\"flags.5?true\"},{\"name\":\"request_needed\",\"type\":\"flags.6?true\"},{\"name\":\"link\",\"type\":\"string\"},{\"name\":\"admin_id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"start_date\",\"type\":\"flags.4?int\"},{\"name\":\"expire_date\",\"type\":\"flags.1?int\"},{\"name\":\"usage_limit\",\"type\":\"flags.2?int\"},{\"name\":\"usage\",\"type\":\"flags.3?int\"},{\"name\":\"requested\",\"type\":\"flags.7?int\"},{\"name\":\"title\",\"type\":\"flags.8?string\"}],\"type\":\"ExportedChatInvite\"},{\"id\":1516793212,\"predicate\":\"chatInviteAlready\",\"params\":[{\"name\":\"chat\",\"type\":\"Chat\"}],\"type\":\"ChatInvite\"},{\"id\":806110401,\"predicate\":\"chatInvite\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"channel\",\"type\":\"flags.0?true\"},{\"name\":\"broadcast\",\"type\":\"flags.1?true\"},{\"name\":\"public\",\"type\":\"flags.2?true\"},{\"name\":\"megagroup\",\"type\":\"flags.3?true\"},{\"name\":\"request_needed\",\"type\":\"flags.6?true\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"about\",\"type\":\"flags.5?string\"},{\"name\":\"photo\",\"type\":\"Photo\"},{\"name\":\"participants_count\",\"type\":\"int\"},{\"name\":\"participants\",\"type\":\"flags.4?Vector<User>\"}],\"type\":\"ChatInvite\"},{\"id\":1634294960,\"predicate\":\"chatInvitePeek\",\"params\":[{\"name\":\"chat\",\"type\":\"Chat\"},{\"name\":\"expires\",\"type\":\"int\"}],\"type\":\"ChatInvite\"},{\"id\":-4838507,\"predicate\":\"inputStickerSetEmpty\",\"params\":[],\"type\":\"InputStickerSet\"},{\"id\":-1645763991,\"predicate\":\"inputStickerSetID\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputStickerSet\"},{\"id\":-2044933984,\"predicate\":\"inputStickerSetShortName\",\"params\":[{\"name\":\"short_name\",\"type\":\"string\"}],\"type\":\"InputStickerSet\"},{\"id\":42402760,\"predicate\":\"inputStickerSetAnimatedEmoji\",\"params\":[],\"type\":\"InputStickerSet\"},{\"id\":-427863538,\"predicate\":\"inputStickerSetDice\",\"params\":[{\"name\":\"emoticon\",\"type\":\"string\"}],\"type\":\"InputStickerSet\"},{\"id\":215889721,\"predicate\":\"inputStickerSetAnimatedEmojiAnimations\",\"params\":[],\"type\":\"InputStickerSet\"},{\"id\":-673242758,\"predicate\":\"stickerSet\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"archived\",\"type\":\"flags.1?true\"},{\"name\":\"official\",\"type\":\"flags.2?true\"},{\"name\":\"masks\",\"type\":\"flags.3?true\"},{\"name\":\"animated\",\"type\":\"flags.5?true\"},{\"name\":\"installed_date\",\"type\":\"flags.0?int\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"short_name\",\"type\":\"string\"},{\"name\":\"thumbs\",\"type\":\"flags.4?Vector<PhotoSize>\"},{\"name\":\"thumb_dc_id\",\"type\":\"flags.4?int\"},{\"name\":\"thumb_version\",\"type\":\"flags.4?int\"},{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"int\"}],\"type\":\"StickerSet\"},{\"id\":-1240849242,\"predicate\":\"messages.stickerSet\",\"params\":[{\"name\":\"set\",\"type\":\"StickerSet\"},{\"name\":\"packs\",\"type\":\"Vector<StickerPack>\"},{\"name\":\"documents\",\"type\":\"Vector<Document>\"}],\"type\":\"messages.StickerSet\"},{\"id\":-738646805,\"predicate\":\"messages.stickerSetNotModified\",\"params\":[],\"type\":\"messages.StickerSet\"},{\"id\":-1032140601,\"predicate\":\"botCommand\",\"params\":[{\"name\":\"command\",\"type\":\"string\"},{\"name\":\"description\",\"type\":\"string\"}],\"type\":\"BotCommand\"},{\"id\":460632885,\"predicate\":\"botInfo\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"description\",\"type\":\"string\"},{\"name\":\"commands\",\"type\":\"Vector<BotCommand>\"}],\"type\":\"BotInfo\"},{\"id\":-1560655744,\"predicate\":\"keyboardButton\",\"params\":[{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"KeyboardButton\"},{\"id\":629866245,\"predicate\":\"keyboardButtonUrl\",\"params\":[{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"KeyboardButton\"},{\"id\":901503851,\"predicate\":\"keyboardButtonCallback\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"requires_password\",\"type\":\"flags.0?true\"},{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"data\",\"type\":\"bytes\"}],\"type\":\"KeyboardButton\"},{\"id\":-1318425559,\"predicate\":\"keyboardButtonRequestPhone\",\"params\":[{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"KeyboardButton\"},{\"id\":-59151553,\"predicate\":\"keyboardButtonRequestGeoLocation\",\"params\":[{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"KeyboardButton\"},{\"id\":90744648,\"predicate\":\"keyboardButtonSwitchInline\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"same_peer\",\"type\":\"flags.0?true\"},{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"query\",\"type\":\"string\"}],\"type\":\"KeyboardButton\"},{\"id\":1358175439,\"predicate\":\"keyboardButtonGame\",\"params\":[{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"KeyboardButton\"},{\"id\":-1344716869,\"predicate\":\"keyboardButtonBuy\",\"params\":[{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"KeyboardButton\"},{\"id\":280464681,\"predicate\":\"keyboardButtonUrlAuth\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"fwd_text\",\"type\":\"flags.0?string\"},{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"button_id\",\"type\":\"int\"}],\"type\":\"KeyboardButton\"},{\"id\":-802258988,\"predicate\":\"inputKeyboardButtonUrlAuth\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"request_write_access\",\"type\":\"flags.0?true\"},{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"fwd_text\",\"type\":\"flags.1?string\"},{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"bot\",\"type\":\"InputUser\"}],\"type\":\"KeyboardButton\"},{\"id\":-1144565411,\"predicate\":\"keyboardButtonRequestPoll\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"quiz\",\"type\":\"flags.0?Bool\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"KeyboardButton\"},{\"id\":-376962181,\"predicate\":\"inputKeyboardButtonUserProfile\",\"params\":[{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"user_id\",\"type\":\"InputUser\"}],\"type\":\"KeyboardButton\"},{\"id\":814112961,\"predicate\":\"keyboardButtonUserProfile\",\"params\":[{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"user_id\",\"type\":\"long\"}],\"type\":\"KeyboardButton\"},{\"id\":2002815875,\"predicate\":\"keyboardButtonRow\",\"params\":[{\"name\":\"buttons\",\"type\":\"Vector<KeyboardButton>\"}],\"type\":\"KeyboardButtonRow\"},{\"id\":-1606526075,\"predicate\":\"replyKeyboardHide\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"selective\",\"type\":\"flags.2?true\"}],\"type\":\"ReplyMarkup\"},{\"id\":-2035021048,\"predicate\":\"replyKeyboardForceReply\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"single_use\",\"type\":\"flags.1?true\"},{\"name\":\"selective\",\"type\":\"flags.2?true\"},{\"name\":\"placeholder\",\"type\":\"flags.3?string\"}],\"type\":\"ReplyMarkup\"},{\"id\":-2049074735,\"predicate\":\"replyKeyboardMarkup\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"resize\",\"type\":\"flags.0?true\"},{\"name\":\"single_use\",\"type\":\"flags.1?true\"},{\"name\":\"selective\",\"type\":\"flags.2?true\"},{\"name\":\"rows\",\"type\":\"Vector<KeyboardButtonRow>\"},{\"name\":\"placeholder\",\"type\":\"flags.3?string\"}],\"type\":\"ReplyMarkup\"},{\"id\":1218642516,\"predicate\":\"replyInlineMarkup\",\"params\":[{\"name\":\"rows\",\"type\":\"Vector<KeyboardButtonRow>\"}],\"type\":\"ReplyMarkup\"},{\"id\":-1148011883,\"predicate\":\"messageEntityUnknown\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":-100378723,\"predicate\":\"messageEntityMention\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":1868782349,\"predicate\":\"messageEntityHashtag\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":1827637959,\"predicate\":\"messageEntityBotCommand\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":1859134776,\"predicate\":\"messageEntityUrl\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":1692693954,\"predicate\":\"messageEntityEmail\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":-1117713463,\"predicate\":\"messageEntityBold\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":-2106619040,\"predicate\":\"messageEntityItalic\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":681706865,\"predicate\":\"messageEntityCode\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":1938967520,\"predicate\":\"messageEntityPre\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"},{\"name\":\"language\",\"type\":\"string\"}],\"type\":\"MessageEntity\"},{\"id\":1990644519,\"predicate\":\"messageEntityTextUrl\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"},{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"MessageEntity\"},{\"id\":-595914432,\"predicate\":\"messageEntityMentionName\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"long\"}],\"type\":\"MessageEntity\"},{\"id\":546203849,\"predicate\":\"inputMessageEntityMentionName\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"InputUser\"}],\"type\":\"MessageEntity\"},{\"id\":-1687559349,\"predicate\":\"messageEntityPhone\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":1280209983,\"predicate\":\"messageEntityCashtag\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":-1672577397,\"predicate\":\"messageEntityUnderline\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":-1090087980,\"predicate\":\"messageEntityStrike\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":34469328,\"predicate\":\"messageEntityBlockquote\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":1981704948,\"predicate\":\"messageEntityBankCard\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":852137487,\"predicate\":\"messageEntitySpoiler\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":-292807034,\"predicate\":\"inputChannelEmpty\",\"params\":[],\"type\":\"InputChannel\"},{\"id\":-212145112,\"predicate\":\"inputChannel\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputChannel\"},{\"id\":1536380829,\"predicate\":\"inputChannelFromMessage\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"channel_id\",\"type\":\"long\"}],\"type\":\"InputChannel\"},{\"id\":2131196633,\"predicate\":\"contacts.resolvedPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"chats\",\"type\":\"Vector<Chat>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"contacts.ResolvedPeer\"},{\"id\":182649427,\"predicate\":\"messageRange\",\"params\":[{\"name\":\"min_id\",\"type\":\"int\"},{\"name\":\"max_id\",\"type\":\"int\"}],\"type\":\"MessageRange\"},{\"id\":1041346555,\"predicate\":\"updates.channelDifferenceEmpty\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"final\",\"type\":\"flags.0?true\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"timeout\",\"type\":\"flags.1?int\"}],\"type\":\"updates.ChannelDifference\"},{\"id\":-1531132162,\"predicate\":\"updates.channelDifferenceTooLong\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"final\",\"type\":\"flags.0?true\"},{\"name\":\"timeout\",\"type\":\"flags.1?int\"},{\"name\":\"dialog\",\"type\":\"Dialog\"},{\"name\":\"messages\",\"type\":\"Vector<Message>\"},{\"name\":\"chats\",\"type\":\"Vector<Chat>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"updates.ChannelDifference\"},{\"id\":543450958,\"predicate\":\"updates.channelDifference\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"final\",\"type\":\"flags.0?true\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"timeout\",\"type\":\"flags.1?int\"},{\"name\":\"new_messages\",\"type\":\"Vector<Message>\"},{\"name\":\"other_updates\",\"type\":\"Vector<Update>\"},{\"name\":\"chats\",\"type\":\"Vector<Chat>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"updates.ChannelDifference\"},{\"id\":-1798033689,\"predicate\":\"channelMessagesFilterEmpty\",\"params\":[],\"type\":\"ChannelMessagesFilter\"},{\"id\":-847783593,\"predicate\":\"channelMessagesFilter\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"exclude_new_messages\",\"type\":\"flags.1?true\"},{\"name\":\"ranges\",\"type\":\"Vector<MessageRange>\"}],\"type\":\"ChannelMessagesFilter\"},{\"id\":-1072953408,\"predicate\":\"channelParticipant\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"ChannelParticipant\"},{\"id\":900251559,\"predicate\":\"channelParticipantSelf\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"via_request\",\"type\":\"flags.0?true\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"inviter_id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"ChannelParticipant\"},{\"id\":803602899,\"predicate\":\"channelParticipantCreator\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"admin_rights\",\"type\":\"ChatAdminRights\"},{\"name\":\"rank\",\"type\":\"flags.0?string\"}],\"type\":\"ChannelParticipant\"},{\"id\":885242707,\"predicate\":\"channelParticipantAdmin\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"can_edit\",\"type\":\"flags.0?true\"},{\"name\":\"self\",\"type\":\"flags.1?true\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"inviter_id\",\"type\":\"flags.1?long\"},{\"name\":\"promoted_by\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"admin_rights\",\"type\":\"ChatAdminRights\"},{\"name\":\"rank\",\"type\":\"flags.2?string\"}],\"type\":\"ChannelParticipant\"},{\"id\":1844969806,\"predicate\":\"channelParticipantBanned\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"left\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"kicked_by\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"banned_rights\",\"type\":\"ChatBannedRights\"}],\"type\":\"ChannelParticipant\"},{\"id\":453242886,\"predicate\":\"channelParticipantLeft\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"}],\"type\":\"ChannelParticipant\"},{\"id\":-566281095,\"predicate\":\"channelParticipantsRecent\",\"params\":[],\"type\":\"ChannelParticipantsFilter\"},{\"id\":-1268741783,\"predicate\":\"channelParticipantsAdmins\",\"params\":[],\"type\":\"ChannelParticipantsFilter\"},{\"id\":-1548400251,\"predicate\":\"channelParticipantsKicked\",\"params\":[{\"name\":\"q\",\"type\":\"string\"}],\"type\":\"ChannelParticipantsFilter\"},{\"id\":-1328445861,\"predicate\":\"channelParticipantsBots\",\"params\":[],\"type\":\"ChannelParticipantsFilter\"},{\"id\":338142689,\"predicate\":\"channelParticipantsBanned\",\"params\":[{\"name\":\"q\",\"type\":\"string\"}],\"type\":\"ChannelParticipantsFilter\"},{\"id\":106343499,\"predicate\":\"channelParticipantsSearch\",\"params\":[{\"name\":\"q\",\"type\":\"string\"}],\"type\":\"ChannelParticipantsFilter\"},{\"id\":-1150621555,\"predicate\":\"channelParticipantsContacts\",\"params\":[{\"name\":\"q\",\"type\":\"string\"}],\"type\":\"ChannelParticipantsFilter\"},{\"id\":-531931925,\"predicate\":\"channelParticipantsMentions\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"q\",\"type\":\"flags.0?string\"},{\"name\":\"top_msg_id\",\"type\":\"flags.1?int\"}],\"type\":\"ChannelParticipantsFilter\"},{\"id\":-1699676497,\"predicate\":\"channels.channelParticipants\",\"params\":[{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"participants\",\"type\":\"Vector<ChannelParticipant>\"},{\"name\":\"chats\",\"type\":\"Vector<Chat>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"channels.ChannelParticipants\"},{\"id\":-266911767,\"predicate\":\"channels.channelParticipantsNotModified\",\"params\":[],\"type\":\"channels.ChannelParticipants\"},{\"id\":-541588713,\"predicate\":\"channels.channelParticipant\",\"params\":[{\"name\":\"participant\",\"type\":\"ChannelParticipant\"},{\"name\":\"chats\",\"type\":\"Vector<Chat>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"channels.ChannelParticipant\"},{\"id\":2013922064,\"predicate\":\"help.termsOfService\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"popup\",\"type\":\"flags.0?true\"},{\"name\":\"id\",\"type\":\"DataJSON\"},{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"Vector<MessageEntity>\"},{\"name\":\"min_age_confirm\",\"type\":\"flags.1?int\"}],\"type\":\"help.TermsOfService\"},{\"id\":-402498398,\"predicate\":\"messages.savedGifsNotModified\",\"params\":[],\"type\":\"messages.SavedGifs\"},{\"id\":-2069878259,\"predicate\":\"messages.savedGifs\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"gifs\",\"type\":\"Vector<Document>\"}],\"type\":\"messages.SavedGifs\"},{\"id\":864077702,\"predicate\":\"inputBotInlineMessageMediaAuto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"flags.1?Vector<MessageEntity>\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"InputBotInlineMessage\"},{\"id\":1036876423,\"predicate\":\"inputBotInlineMessageText\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"no_webpage\",\"type\":\"flags.0?true\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"flags.1?Vector<MessageEntity>\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"InputBotInlineMessage\"},{\"id\":-1768777083,\"predicate\":\"inputBotInlineMessageMediaGeo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"geo_point\",\"type\":\"InputGeoPoint\"},{\"name\":\"heading\",\"type\":\"flags.0?int\"},{\"name\":\"period\",\"type\":\"flags.1?int\"},{\"name\":\"proximity_notification_radius\",\"type\":\"flags.3?int\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"InputBotInlineMessage\"},{\"id\":1098628881,\"predicate\":\"inputBotInlineMessageMediaVenue\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"geo_point\",\"type\":\"InputGeoPoint\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"address\",\"type\":\"string\"},{\"name\":\"provider\",\"type\":\"string\"},{\"name\":\"venue_id\",\"type\":\"string\"},{\"name\":\"venue_type\",\"type\":\"string\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"InputBotInlineMessage\"},{\"id\":-1494368259,\"predicate\":\"inputBotInlineMessageMediaContact\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"first_name\",\"type\":\"string\"},{\"name\":\"last_name\",\"type\":\"string\"},{\"name\":\"vcard\",\"type\":\"string\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"InputBotInlineMessage\"},{\"id\":1262639204,\"predicate\":\"inputBotInlineMessageGame\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"InputBotInlineMessage\"},{\"id\":-672693723,\"predicate\":\"inputBotInlineMessageMediaInvoice\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"description\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"flags.0?InputWebDocument\"},{\"name\":\"invoice\",\"type\":\"Invoice\"},{\"name\":\"payload\",\"type\":\"bytes\"},{\"name\":\"provider\",\"type\":\"string\"},{\"name\":\"provider_data\",\"type\":\"DataJSON\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"InputBotInlineMessage\"},{\"id\":-2000710887,\"predicate\":\"inputBotInlineResult\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"title\",\"type\":\"flags.1?string\"},{\"name\":\"description\",\"type\":\"flags.2?string\"},{\"name\":\"url\",\"type\":\"flags.3?string\"},{\"name\":\"thumb\",\"type\":\"flags.4?InputWebDocument\"},{\"name\":\"content\",\"type\":\"flags.5?InputWebDocument\"},{\"name\":\"send_message\",\"type\":\"InputBotInlineMessage\"}],\"type\":\"InputBotInlineResult\"},{\"id\":-1462213465,\"predicate\":\"inputBotInlineResultPhoto\",\"params\":[{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"InputPhoto\"},{\"name\":\"send_message\",\"type\":\"InputBotInlineMessage\"}],\"type\":\"InputBotInlineResult\"},{\"id\":-459324,\"predicate\":\"inputBotInlineResultDocument\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"title\",\"type\":\"flags.1?string\"},{\"name\":\"description\",\"type\":\"flags.2?string\"},{\"name\":\"document\",\"type\":\"InputDocument\"},{\"name\":\"send_message\",\"type\":\"InputBotInlineMessage\"}],\"type\":\"InputBotInlineResult\"},{\"id\":1336154098,\"predicate\":\"inputBotInlineResultGame\",\"params\":[{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"short_name\",\"type\":\"string\"},{\"name\":\"send_message\",\"type\":\"InputBotInlineMessage\"}],\"type\":\"InputBotInlineResult\"},{\"id\":1984755728,\"predicate\":\"botInlineMessageMediaAuto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"flags.1?Vector<MessageEntity>\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"BotInlineMessage\"},{\"id\":-1937807902,\"predicate\":\"botInlineMessageText\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"no_webpage\",\"type\":\"flags.0?true\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"flags.1?Vector<MessageEntity>\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"BotInlineMessage\"},{\"id\":85477117,\"predicate\":\"botInlineMessageMediaGeo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"geo\",\"type\":\"GeoPoint\"},{\"name\":\"heading\",\"type\":\"flags.0?int\"},{\"name\":\"period\",\"type\":\"flags.1?int\"},{\"name\":\"proximity_notification_radius\",\"type\":\"flags.3?int\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"BotInlineMessage\"},{\"id\":-1970903652,\"predicate\":\"botInlineMessageMediaVenue\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"geo\",\"type\":\"GeoPoint\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"address\",\"type\":\"string\"},{\"name\":\"provider\",\"type\":\"string\"},{\"name\":\"venue_id\",\"type\":\"string\"},{\"name\":\"venue_type\",\"type\":\"string\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"BotInlineMessage\"},{\"id\":416402882,\"predicate\":\"botInlineMessageMediaContact\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"first_name\",\"type\":\"string\"},{\"name\":\"last_name\",\"type\":\"string\"},{\"name\":\"vcard\",\"type\":\"string\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"BotInlineMessage\"},{\"id\":894081801,\"predicate\":\"botInlineMessageMediaInvoice\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"shipping_address_requested\",\"type\":\"flags.1?true\"},{\"name\":\"test\",\"type\":\"flags.3?true\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"description\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"flags.0?WebDocument\"},{\"name\":\"currency\",\"type\":\"string\"},{\"name\":\"total_amount\",\"type\":\"long\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"BotInlineMessage\"},{\"id\":295067450,\"predicate\":\"botInlineResult\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"title\",\"type\":\"flags.1?string\"},{\"name\":\"description\",\"type\":\"flags.2?string\"},{\"name\":\"url\",\"type\":\"flags.3?string\"},{\"name\":\"thumb\",\"type\":\"flags.4?WebDocument\"},{\"name\":\"content\",\"type\":\"flags.5?WebDocument\"},{\"name\":\"send_message\",\"type\":\"BotInlineMessage\"}],\"type\":\"BotInlineResult\"},{\"id\":400266251,\"predicate\":\"botInlineMediaResult\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"flags.0?Photo\"},{\"name\":\"document\",\"type\":\"flags.1?Document\"},{\"name\":\"title\",\"type\":\"flags.2?string\"},{\"name\":\"description\",\"type\":\"flags.3?string\"},{\"name\":\"send_message\",\"type\":\"BotInlineMessage\"}],\"type\":\"BotInlineResult\"},{\"id\":-1803769784,\"predicate\":\"messages.botResults\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"gallery\",\"type\":\"flags.0?true\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"next_offset\",\"type\":\"flags.1?string\"},{\"name\":\"switch_pm\",\"type\":\"flags.2?InlineBotSwitchPM\"},{\"name\":\"results\",\"type\":\"Vector<BotInlineResult>\"},{\"name\":\"cache_time\",\"type\":\"int\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"messages.BotResults\"},{\"id\":1571494644,\"predicate\":\"exportedMessageLink\",\"params\":[{\"name\":\"link\",\"type\":\"string\"},{\"name\":\"html\",\"type\":\"string\"}],\"type\":\"ExportedMessageLink\"},{\"id\":1601666510,\"predicate\":\"messageFwdHeader\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"imported\",\"type\":\"flags.7?true\"},{\"name\":\"from_id\",\"type\":\"flags.0?Peer\"},{\"name\":\"from_name\",\"type\":\"flags.5?string\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"channel_post\",\"type\":\"flags.2?int\"},{\"name\":\"post_author\",\"type\":\"flags.3?string\"},{\"name\":\"saved_from_peer\",\"type\":\"flags.4?Peer\"},{\"name\":\"saved_from_msg_id\",\"type\":\"flags.4?int\"},{\"name\":\"psa_type\",\"type\":\"flags.6?string\"}],\"type\":\"MessageFwdHeader\"},{\"id\":1923290508,\"predicate\":\"auth.codeTypeSms\",\"params\":[],\"type\":\"auth.CodeType\"},{\"id\":1948046307,\"predicate\":\"auth.codeTypeCall\",\"params\":[],\"type\":\"auth.CodeType\"},{\"id\":577556219,\"predicate\":\"auth.codeTypeFlashCall\",\"params\":[],\"type\":\"auth.CodeType\"},{\"id\":-702884114,\"predicate\":\"auth.codeTypeMissedCall\",\"params\":[],\"type\":\"auth.CodeType\"},{\"id\":1035688326,\"predicate\":\"auth.sentCodeTypeApp\",\"params\":[{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"auth.SentCodeType\"},{\"id\":-1073693790,\"predicate\":\"auth.sentCodeTypeSms\",\"params\":[{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"auth.SentCodeType\"},{\"id\":1398007207,\"predicate\":\"auth.sentCodeTypeCall\",\"params\":[{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"auth.SentCodeType\"},{\"id\":-1425815847,\"predicate\":\"auth.sentCodeTypeFlashCall\",\"params\":[{\"name\":\"pattern\",\"type\":\"string\"}],\"type\":\"auth.SentCodeType\"},{\"id\":-2113903484,\"predicate\":\"auth.sentCodeTypeMissedCall\",\"params\":[{\"name\":\"prefix\",\"type\":\"string\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"auth.SentCodeType\"},{\"id\":911761060,\"predicate\":\"messages.botCallbackAnswer\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"alert\",\"type\":\"flags.1?true\"},{\"name\":\"has_url\",\"type\":\"flags.3?true\"},{\"name\":\"native_ui\",\"type\":\"flags.4?true\"},{\"name\":\"message\",\"type\":\"flags.0?string\"},{\"name\":\"url\",\"type\":\"flags.2?string\"},{\"name\":\"cache_time\",\"type\":\"int\"}],\"type\":\"messages.BotCallbackAnswer\"},{\"id\":649453030,\"predicate\":\"messages.messageEditData\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"caption\",\"type\":\"flags.0?true\"}],\"type\":\"messages.MessageEditData\"},{\"id\":-1995686519,\"predicate\":\"inputBotInlineMessageID\",\"params\":[{\"name\":\"dc_id\",\"type\":\"int\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputBotInlineMessageID\"},{\"id\":-1227287081,\"predicate\":\"inputBotInlineMessageID64\",\"params\":[{\"name\":\"dc_id\",\"type\":\"int\"},{\"name\":\"owner_id\",\"type\":\"long\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputBotInlineMessageID\"},{\"id\":1008755359,\"predicate\":\"inlineBotSwitchPM\",\"params\":[{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"start_param\",\"type\":\"string\"}],\"type\":\"InlineBotSwitchPM\"},{\"id\":863093588,\"predicate\":\"messages.peerDialogs\",\"params\":[{\"name\":\"dialogs\",\"type\":\"Vector<Dialog>\"},{\"name\":\"messages\",\"type\":\"Vector<Message>\"},{\"name\":\"chats\",\"type\":\"Vector<Chat>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"},{\"name\":\"state\",\"type\":\"updates.State\"}],\"type\":\"messages.PeerDialogs\"},{\"id\":-305282981,\"predicate\":\"topPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"rating\",\"type\":\"double\"}],\"type\":\"TopPeer\"},{\"id\":-1419371685,\"predicate\":\"topPeerCategoryBotsPM\",\"params\":[],\"type\":\"TopPeerCategory\"},{\"id\":344356834,\"predicate\":\"topPeerCategoryBotsInline\",\"params\":[],\"type\":\"TopPeerCategory\"},{\"id\":104314861,\"predicate\":\"topPeerCategoryCorrespondents\",\"params\":[],\"type\":\"TopPeerCategory\"},{\"id\":-1122524854,\"predicate\":\"topPeerCategoryGroups\",\"params\":[],\"type\":\"TopPeerCategory\"},{\"id\":371037736,\"predicate\":\"topPeerCategoryChannels\",\"params\":[],\"type\":\"TopPeerCategory\"},{\"id\":511092620,\"predicate\":\"topPeerCategoryPhoneCalls\",\"params\":[],\"type\":\"TopPeerCategory\"},{\"id\":-1472172887,\"predicate\":\"topPeerCategoryForwardUsers\",\"params\":[],\"type\":\"TopPeerCategory\"},{\"id\":-68239120,\"predicate\":\"topPeerCategoryForwardChats\",\"params\":[],\"type\":\"TopPeerCategory\"},{\"id\":-75283823,\"predicate\":\"topPeerCategoryPeers\",\"params\":[{\"name\":\"category\",\"type\":\"TopPeerCategory\"},{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"peers\",\"type\":\"Vector<TopPeer>\"}],\"type\":\"TopPeerCategoryPeers\"},{\"id\":-567906571,\"predicate\":\"contacts.topPeersNotModified\",\"params\":[],\"type\":\"contacts.TopPeers\"},{\"id\":1891070632,\"predicate\":\"contacts.topPeers\",\"params\":[{\"name\":\"categories\",\"type\":\"Vector<TopPeerCategoryPeers>\"},{\"name\":\"chats\",\"type\":\"Vector<Chat>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"contacts.TopPeers\"},{\"id\":-1255369827,\"predicate\":\"contacts.topPeersDisabled\",\"params\":[],\"type\":\"contacts.TopPeers\"},{\"id\":453805082,\"predicate\":\"draftMessageEmpty\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"date\",\"type\":\"flags.0?int\"}],\"type\":\"DraftMessage\"},{\"id\":-40996577,\"predicate\":\"draftMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"no_webpage\",\"type\":\"flags.1?true\"},{\"name\":\"reply_to_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"flags.3?Vector<MessageEntity>\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"DraftMessage\"},{\"id\":-958657434,\"predicate\":\"messages.featuredStickersNotModified\",\"params\":[{\"name\":\"count\",\"type\":\"int\"}],\"type\":\"messages.FeaturedStickers\"},{\"id\":-2067782896,\"predicate\":\"messages.featuredStickers\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"sets\",\"type\":\"Vector<StickerSetCovered>\"},{\"name\":\"unread\",\"type\":\"Vector<long>\"}],\"type\":\"messages.FeaturedStickers\"},{\"id\":186120336,\"predicate\":\"messages.recentStickersNotModified\",\"params\":[],\"type\":\"messages.RecentStickers\"},{\"id\":-1999405994,\"predicate\":\"messages.recentStickers\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"packs\",\"type\":\"Vector<StickerPack>\"},{\"name\":\"stickers\",\"type\":\"Vector<Document>\"},{\"name\":\"dates\",\"type\":\"Vector<int>\"}],\"type\":\"messages.RecentStickers\"},{\"id\":1338747336,\"predicate\":\"messages.archivedStickers\",\"params\":[{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"sets\",\"type\":\"Vector<StickerSetCovered>\"}],\"type\":\"messages.ArchivedStickers\"},{\"id\":946083368,\"predicate\":\"messages.stickerSetInstallResultSuccess\",\"params\":[],\"type\":\"messages.StickerSetInstallResult\"},{\"id\":904138920,\"predicate\":\"messages.stickerSetInstallResultArchive\",\"params\":[{\"name\":\"sets\",\"type\":\"Vector<StickerSetCovered>\"}],\"type\":\"messages.StickerSetInstallResult\"},{\"id\":1678812626,\"predicate\":\"stickerSetCovered\",\"params\":[{\"name\":\"set\",\"type\":\"StickerSet\"},{\"name\":\"cover\",\"type\":\"Document\"}],\"type\":\"StickerSetCovered\"},{\"id\":872932635,\"predicate\":\"stickerSetMultiCovered\",\"params\":[{\"name\":\"set\",\"type\":\"StickerSet\"},{\"name\":\"covers\",\"type\":\"Vector<Document>\"}],\"type\":\"StickerSetCovered\"},{\"id\":-1361650766,\"predicate\":\"maskCoords\",\"params\":[{\"name\":\"n\",\"type\":\"int\"},{\"name\":\"x\",\"type\":\"double\"},{\"name\":\"y\",\"type\":\"double\"},{\"name\":\"zoom\",\"type\":\"double\"}],\"type\":\"MaskCoords\"},{\"id\":1251549527,\"predicate\":\"inputStickeredMediaPhoto\",\"params\":[{\"name\":\"id\",\"type\":\"InputPhoto\"}],\"type\":\"InputStickeredMedia\"},{\"id\":70813275,\"predicate\":\"inputStickeredMediaDocument\",\"params\":[{\"name\":\"id\",\"type\":\"InputDocument\"}],\"type\":\"InputStickeredMedia\"},{\"id\":-1107729093,\"predicate\":\"game\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"short_name\",\"type\":\"string\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"description\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"Photo\"},{\"name\":\"document\",\"type\":\"flags.0?Document\"}],\"type\":\"Game\"},{\"id\":53231223,\"predicate\":\"inputGameID\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputGame\"},{\"id\":-1020139510,\"predicate\":\"inputGameShortName\",\"params\":[{\"name\":\"bot_id\",\"type\":\"InputUser\"},{\"name\":\"short_name\",\"type\":\"string\"}],\"type\":\"InputGame\"},{\"id\":1940093419,\"predicate\":\"highScore\",\"params\":[{\"name\":\"pos\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"score\",\"type\":\"int\"}],\"type\":\"HighScore\"},{\"id\":-1707344487,\"predicate\":\"messages.highScores\",\"params\":[{\"name\":\"scores\",\"type\":\"Vector<HighScore>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"messages.HighScores\"},{\"id\":-599948721,\"predicate\":\"textEmpty\",\"params\":[],\"type\":\"RichText\"},{\"id\":1950782688,\"predicate\":\"textPlain\",\"params\":[{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"RichText\"},{\"id\":1730456516,\"predicate\":\"textBold\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"RichText\"},{\"id\":-653089380,\"predicate\":\"textItalic\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"RichText\"},{\"id\":-1054465340,\"predicate\":\"textUnderline\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"RichText\"},{\"id\":-1678197867,\"predicate\":\"textStrike\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"RichText\"},{\"id\":1816074681,\"predicate\":\"textFixed\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"RichText\"},{\"id\":1009288385,\"predicate\":\"textUrl\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"},{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"webpage_id\",\"type\":\"long\"}],\"type\":\"RichText\"},{\"id\":-564523562,\"predicate\":\"textEmail\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"},{\"name\":\"email\",\"type\":\"string\"}],\"type\":\"RichText\"},{\"id\":2120376535,\"predicate\":\"textConcat\",\"params\":[{\"name\":\"texts\",\"type\":\"Vector<RichText>\"}],\"type\":\"RichText\"},{\"id\":-311786236,\"predicate\":\"textSubscript\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"RichText\"},{\"id\":-939827711,\"predicate\":\"textSuperscript\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"RichText\"},{\"id\":55281185,\"predicate\":\"textMarked\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"RichText\"},{\"id\":483104362,\"predicate\":\"textPhone\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"},{\"name\":\"phone\",\"type\":\"string\"}],\"type\":\"RichText\"},{\"id\":136105807,\"predicate\":\"textImage\",\"params\":[{\"name\":\"document_id\",\"type\":\"long\"},{\"name\":\"w\",\"type\":\"int\"},{\"name\":\"h\",\"type\":\"int\"}],\"type\":\"RichText\"},{\"id\":894777186,\"predicate\":\"textAnchor\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"},{\"name\":\"name\",\"type\":\"string\"}],\"type\":\"RichText\"},{\"id\":324435594,\"predicate\":\"pageBlockUnsupported\",\"params\":[],\"type\":\"PageBlock\"},{\"id\":1890305021,\"predicate\":\"pageBlockTitle\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":-1879401953,\"predicate\":\"pageBlockSubtitle\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":-1162877472,\"predicate\":\"pageBlockAuthorDate\",\"params\":[{\"name\":\"author\",\"type\":\"RichText\"},{\"name\":\"published_date\",\"type\":\"int\"}],\"type\":\"PageBlock\"},{\"id\":-1076861716,\"predicate\":\"pageBlockHeader\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":-248793375,\"predicate\":\"pageBlockSubheader\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":1182402406,\"predicate\":\"pageBlockParagraph\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":-1066346178,\"predicate\":\"pageBlockPreformatted\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"},{\"name\":\"language\",\"type\":\"string\"}],\"type\":\"PageBlock\"},{\"id\":1216809369,\"predicate\":\"pageBlockFooter\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":-618614392,\"predicate\":\"pageBlockDivider\",\"params\":[],\"type\":\"PageBlock\"},{\"id\":-837994576,\"predicate\":\"pageBlockAnchor\",\"params\":[{\"name\":\"name\",\"type\":\"string\"}],\"type\":\"PageBlock\"},{\"id\":-454524911,\"predicate\":\"pageBlockList\",\"params\":[{\"name\":\"items\",\"type\":\"Vector<PageListItem>\"}],\"type\":\"PageBlock\"},{\"id\":641563686,\"predicate\":\"pageBlockBlockquote\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"},{\"name\":\"caption\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":1329878739,\"predicate\":\"pageBlockPullquote\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"},{\"name\":\"caption\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":391759200,\"predicate\":\"pageBlockPhoto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"photo_id\",\"type\":\"long\"},{\"name\":\"caption\",\"type\":\"PageCaption\"},{\"name\":\"url\",\"type\":\"flags.0?string\"},{\"name\":\"webpage_id\",\"type\":\"flags.0?long\"}],\"type\":\"PageBlock\"},{\"id\":2089805750,\"predicate\":\"pageBlockVideo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"autoplay\",\"type\":\"flags.0?true\"},{\"name\":\"loop\",\"type\":\"flags.1?true\"},{\"name\":\"video_id\",\"type\":\"long\"},{\"name\":\"caption\",\"type\":\"PageCaption\"}],\"type\":\"PageBlock\"},{\"id\":972174080,\"predicate\":\"pageBlockCover\",\"params\":[{\"name\":\"cover\",\"type\":\"PageBlock\"}],\"type\":\"PageBlock\"},{\"id\":-1468953147,\"predicate\":\"pageBlockEmbed\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"full_width\",\"type\":\"flags.0?true\"},{\"name\":\"allow_scrolling\",\"type\":\"flags.3?true\"},{\"name\":\"url\",\"type\":\"flags.1?string\"},{\"name\":\"html\",\"type\":\"flags.2?string\"},{\"name\":\"poster_photo_id\",\"type\":\"flags.4?long\"},{\"name\":\"w\",\"type\":\"flags.5?int\"},{\"name\":\"h\",\"type\":\"flags.5?int\"},{\"name\":\"caption\",\"type\":\"PageCaption\"}],\"type\":\"PageBlock\"},{\"id\":-229005301,\"predicate\":\"pageBlockEmbedPost\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"webpage_id\",\"type\":\"long\"},{\"name\":\"author_photo_id\",\"type\":\"long\"},{\"name\":\"author\",\"type\":\"string\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"blocks\",\"type\":\"Vector<PageBlock>\"},{\"name\":\"caption\",\"type\":\"PageCaption\"}],\"type\":\"PageBlock\"},{\"id\":1705048653,\"predicate\":\"pageBlockCollage\",\"params\":[{\"name\":\"items\",\"type\":\"Vector<PageBlock>\"},{\"name\":\"caption\",\"type\":\"PageCaption\"}],\"type\":\"PageBlock\"},{\"id\":52401552,\"predicate\":\"pageBlockSlideshow\",\"params\":[{\"name\":\"items\",\"type\":\"Vector<PageBlock>\"},{\"name\":\"caption\",\"type\":\"PageCaption\"}],\"type\":\"PageBlock\"},{\"id\":-283684427,\"predicate\":\"pageBlockChannel\",\"params\":[{\"name\":\"channel\",\"type\":\"Chat\"}],\"type\":\"PageBlock\"},{\"id\":-2143067670,\"predicate\":\"pageBlockAudio\",\"params\":[{\"name\":\"audio_id\",\"type\":\"long\"},{\"name\":\"caption\",\"type\":\"PageCaption\"}],\"type\":\"PageBlock\"},{\"id\":504660880,\"predicate\":\"pageBlockKicker\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":-1085412734,\"predicate\":\"pageBlockTable\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"bordered\",\"type\":\"flags.0?true\"},{\"name\":\"striped\",\"type\":\"flags.1?true\"},{\"name\":\"title\",\"type\":\"RichText\"},{\"name\":\"rows\",\"type\":\"Vector<PageTableRow>\"}],\"type\":\"PageBlock\"},{\"id\":-1702174239,\"predicate\":\"pageBlockOrderedList\",\"params\":[{\"name\":\"items\",\"type\":\"Vector<PageListOrderedItem>\"}],\"type\":\"PageBlock\"},{\"id\":1987480557,\"predicate\":\"pageBlockDetails\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"open\",\"type\":\"flags.0?true\"},{\"name\":\"blocks\",\"type\":\"Vector<PageBlock>\"},{\"name\":\"title\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":370236054,\"predicate\":\"pageBlockRelatedArticles\",\"params\":[{\"name\":\"title\",\"type\":\"RichText\"},{\"name\":\"articles\",\"type\":\"Vector<PageRelatedArticle>\"}],\"type\":\"PageBlock\"},{\"id\":-1538310410,\"predicate\":\"pageBlockMap\",\"params\":[{\"name\":\"geo\",\"type\":\"GeoPoint\"},{\"name\":\"zoom\",\"type\":\"int\"},{\"name\":\"w\",\"type\":\"int\"},{\"name\":\"h\",\"type\":\"int\"},{\"name\":\"caption\",\"type\":\"PageCaption\"}],\"type\":\"PageBlock\"},{\"id\":-2048646399,\"predicate\":\"phoneCallDiscardReasonMissed\",\"params\":[],\"type\":\"PhoneCallDiscardReason\"},{\"id\":-527056480,\"predicate\":\"phoneCallDiscardReasonDisconnect\",\"params\":[],\"type\":\"PhoneCallDiscardReason\"},{\"id\":1471006352,\"predicate\":\"phoneCallDiscardReasonHangup\",\"params\":[],\"type\":\"PhoneCallDiscardReason\"},{\"id\":-84416311,\"predicate\":\"phoneCallDiscardReasonBusy\",\"params\":[],\"type\":\"PhoneCallDiscardReason\"},{\"id\":2104790276,\"predicate\":\"dataJSON\",\"params\":[{\"name\":\"data\",\"type\":\"string\"}],\"type\":\"DataJSON\"},{\"id\":-886477832,\"predicate\":\"labeledPrice\",\"params\":[{\"name\":\"label\",\"type\":\"string\"},{\"name\":\"amount\",\"type\":\"long\"}],\"type\":\"LabeledPrice\"},{\"id\":215516896,\"predicate\":\"invoice\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"test\",\"type\":\"flags.0?true\"},{\"name\":\"name_requested\",\"type\":\"flags.1?true\"},{\"name\":\"phone_requested\",\"type\":\"flags.2?true\"},{\"name\":\"email_requested\",\"type\":\"flags.3?true\"},{\"name\":\"shipping_address_requested\",\"type\":\"flags.4?true\"},{\"name\":\"flexible\",\"type\":\"flags.5?true\"},{\"name\":\"phone_to_provider\",\"type\":\"flags.6?true\"},{\"name\":\"email_to_provider\",\"type\":\"flags.7?true\"},{\"name\":\"currency\",\"type\":\"string\"},{\"name\":\"prices\",\"type\":\"Vector<LabeledPrice>\"},{\"name\":\"max_tip_amount\",\"type\":\"flags.8?long\"},{\"name\":\"suggested_tip_amounts\",\"type\":\"flags.8?Vector<long>\"}],\"type\":\"Invoice\"},{\"id\":-368917890,\"predicate\":\"paymentCharge\",\"params\":[{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"provider_charge_id\",\"type\":\"string\"}],\"type\":\"PaymentCharge\"},{\"id\":512535275,\"predicate\":\"postAddress\",\"params\":[{\"name\":\"street_line1\",\"type\":\"string\"},{\"name\":\"street_line2\",\"type\":\"string\"},{\"name\":\"city\",\"type\":\"string\"},{\"name\":\"state\",\"type\":\"string\"},{\"name\":\"country_iso2\",\"type\":\"string\"},{\"name\":\"post_code\",\"type\":\"string\"}],\"type\":\"PostAddress\"},{\"id\":-1868808300,\"predicate\":\"paymentRequestedInfo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"name\",\"type\":\"flags.0?string\"},{\"name\":\"phone\",\"type\":\"flags.1?string\"},{\"name\":\"email\",\"type\":\"flags.2?string\"},{\"name\":\"shipping_address\",\"type\":\"flags.3?PostAddress\"}],\"type\":\"PaymentRequestedInfo\"},{\"id\":-842892769,\"predicate\":\"paymentSavedCredentialsCard\",\"params\":[{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"title\",\"type\":\"string\"}],\"type\":\"PaymentSavedCredentials\"},{\"id\":475467473,\"predicate\":\"webDocument\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"size\",\"type\":\"int\"},{\"name\":\"mime_type\",\"type\":\"string\"},{\"name\":\"attributes\",\"type\":\"Vector<DocumentAttribute>\"}],\"type\":\"WebDocument\"},{\"id\":-104284986,\"predicate\":\"webDocumentNoProxy\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"size\",\"type\":\"int\"},{\"name\":\"mime_type\",\"type\":\"string\"},{\"name\":\"attributes\",\"type\":\"Vector<DocumentAttribute>\"}],\"type\":\"WebDocument\"},{\"id\":-1678949555,\"predicate\":\"inputWebDocument\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"size\",\"type\":\"int\"},{\"name\":\"mime_type\",\"type\":\"string\"},{\"name\":\"attributes\",\"type\":\"Vector<DocumentAttribute>\"}],\"type\":\"InputWebDocument\"},{\"id\":-1036396922,\"predicate\":\"inputWebFileLocation\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputWebFileLocation\"},{\"id\":-1625153079,\"predicate\":\"inputWebFileGeoPointLocation\",\"params\":[{\"name\":\"geo_point\",\"type\":\"InputGeoPoint\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"w\",\"type\":\"int\"},{\"name\":\"h\",\"type\":\"int\"},{\"name\":\"zoom\",\"type\":\"int\"},{\"name\":\"scale\",\"type\":\"int\"}],\"type\":\"InputWebFileLocation\"},{\"id\":568808380,\"predicate\":\"upload.webFile\",\"params\":[{\"name\":\"size\",\"type\":\"int\"},{\"name\":\"mime_type\",\"type\":\"string\"},{\"name\":\"file_type\",\"type\":\"storage.FileType\"},{\"name\":\"mtime\",\"type\":\"int\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"upload.WebFile\"},{\"id\":378828315,\"predicate\":\"payments.paymentForm\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"can_save_credentials\",\"type\":\"flags.2?true\"},{\"name\":\"password_missing\",\"type\":\"flags.3?true\"},{\"name\":\"form_id\",\"type\":\"long\"},{\"name\":\"bot_id\",\"type\":\"long\"},{\"name\":\"invoice\",\"type\":\"Invoice\"},{\"name\":\"provider_id\",\"type\":\"long\"},{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"native_provider\",\"type\":\"flags.4?string\"},{\"name\":\"native_params\",\"type\":\"flags.4?DataJSON\"},{\"name\":\"saved_info\",\"type\":\"flags.0?PaymentRequestedInfo\"},{\"name\":\"saved_credentials\",\"type\":\"flags.1?PaymentSavedCredentials\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"payments.PaymentForm\"},{\"id\":-784000893,\"predicate\":\"payments.validatedRequestedInfo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"flags.0?string\"},{\"name\":\"shipping_options\",\"type\":\"flags.1?Vector<ShippingOption>\"}],\"type\":\"payments.ValidatedRequestedInfo\"},{\"id\":1314881805,\"predicate\":\"payments.paymentResult\",\"params\":[{\"name\":\"updates\",\"type\":\"Updates\"}],\"type\":\"payments.PaymentResult\"},{\"id\":-666824391,\"predicate\":\"payments.paymentVerificationNeeded\",\"params\":[{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"payments.PaymentResult\"},{\"id\":1891958275,\"predicate\":\"payments.paymentReceipt\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"bot_id\",\"type\":\"long\"},{\"name\":\"provider_id\",\"type\":\"long\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"description\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"flags.2?WebDocument\"},{\"name\":\"invoice\",\"type\":\"Invoice\"},{\"name\":\"info\",\"type\":\"flags.0?PaymentRequestedInfo\"},{\"name\":\"shipping\",\"type\":\"flags.1?ShippingOption\"},{\"name\":\"tip_amount\",\"type\":\"flags.3?long\"},{\"name\":\"currency\",\"type\":\"string\"},{\"name\":\"total_amount\",\"type\":\"long\"},{\"name\":\"credentials_title\",\"type\":\"string\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"payments.PaymentReceipt\"},{\"id\":-74456004,\"predicate\":\"payments.savedInfo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"has_saved_credentials\",\"type\":\"flags.1?true\"},{\"name\":\"saved_info\",\"type\":\"flags.0?PaymentRequestedInfo\"}],\"type\":\"payments.SavedInfo\"},{\"id\":-1056001329,\"predicate\":\"inputPaymentCredentialsSaved\",\"params\":[{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"tmp_password\",\"type\":\"bytes\"}],\"type\":\"InputPaymentCredentials\"},{\"id\":873977640,\"predicate\":\"inputPaymentCredentials\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"save\",\"type\":\"flags.0?true\"},{\"name\":\"data\",\"type\":\"DataJSON\"}],\"type\":\"InputPaymentCredentials\"},{\"id\":178373535,\"predicate\":\"inputPaymentCredentialsApplePay\",\"params\":[{\"name\":\"payment_data\",\"type\":\"DataJSON\"}],\"type\":\"InputPaymentCredentials\"},{\"id\":-1966921727,\"predicate\":\"inputPaymentCredentialsGooglePay\",\"params\":[{\"name\":\"payment_token\",\"type\":\"DataJSON\"}],\"type\":\"InputPaymentCredentials\"},{\"id\":-614138572,\"predicate\":\"account.tmpPassword\",\"params\":[{\"name\":\"tmp_password\",\"type\":\"bytes\"},{\"name\":\"valid_until\",\"type\":\"int\"}],\"type\":\"account.TmpPassword\"},{\"id\":-1239335713,\"predicate\":\"shippingOption\",\"params\":[{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"prices\",\"type\":\"Vector<LabeledPrice>\"}],\"type\":\"ShippingOption\"},{\"id\":-6249322,\"predicate\":\"inputStickerSetItem\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"document\",\"type\":\"InputDocument\"},{\"name\":\"emoji\",\"type\":\"string\"},{\"name\":\"mask_coords\",\"type\":\"flags.0?MaskCoords\"}],\"type\":\"InputStickerSetItem\"},{\"id\":506920429,\"predicate\":\"inputPhoneCall\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputPhoneCall\"},{\"id\":1399245077,\"predicate\":\"phoneCallEmpty\",\"params\":[{\"name\":\"id\",\"type\":\"long\"}],\"type\":\"PhoneCall\"},{\"id\":-987599081,\"predicate\":\"phoneCallWaiting\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"video\",\"type\":\"flags.6?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"admin_id\",\"type\":\"long\"},{\"name\":\"participant_id\",\"type\":\"long\"},{\"name\":\"protocol\",\"type\":\"PhoneCallProtocol\"},{\"name\":\"receive_date\",\"type\":\"flags.0?int\"}],\"type\":\"PhoneCall\"},{\"id\":347139340,\"predicate\":\"phoneCallRequested\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"video\",\"type\":\"flags.6?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"admin_id\",\"type\":\"long\"},{\"name\":\"participant_id\",\"type\":\"long\"},{\"name\":\"g_a_hash\",\"type\":\"bytes\"},{\"name\":\"protocol\",\"type\":\"PhoneCallProtocol\"}],\"type\":\"PhoneCall\"},{\"id\":912311057,\"predicate\":\"phoneCallAccepted\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"video\",\"type\":\"flags.6?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"admin_id\",\"type\":\"long\"},{\"name\":\"participant_id\",\"type\":\"long\"},{\"name\":\"g_b\",\"type\":\"bytes\"},{\"name\":\"protocol\",\"type\":\"PhoneCallProtocol\"}],\"type\":\"PhoneCall\"},{\"id\":-1770029977,\"predicate\":\"phoneCall\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"p2p_allowed\",\"type\":\"flags.5?true\"},{\"name\":\"video\",\"type\":\"flags.6?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"admin_id\",\"type\":\"long\"},{\"name\":\"participant_id\",\"type\":\"long\"},{\"name\":\"g_a_or_b\",\"type\":\"bytes\"},{\"name\":\"key_fingerprint\",\"type\":\"long\"},{\"name\":\"protocol\",\"type\":\"PhoneCallProtocol\"},{\"name\":\"connections\",\"type\":\"Vector<PhoneConnection>\"},{\"name\":\"start_date\",\"type\":\"int\"}],\"type\":\"PhoneCall\"},{\"id\":1355435489,\"predicate\":\"phoneCallDiscarded\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"need_rating\",\"type\":\"flags.2?true\"},{\"name\":\"need_debug\",\"type\":\"flags.3?true\"},{\"name\":\"video\",\"type\":\"flags.6?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"reason\",\"type\":\"flags.0?PhoneCallDiscardReason\"},{\"name\":\"duration\",\"type\":\"flags.1?int\"}],\"type\":\"PhoneCall\"},{\"id\":-1655957568,\"predicate\":\"phoneConnection\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"ip\",\"type\":\"string\"},{\"name\":\"ipv6\",\"type\":\"string\"},{\"name\":\"port\",\"type\":\"int\"},{\"name\":\"peer_tag\",\"type\":\"bytes\"}],\"type\":\"PhoneConnection\"},{\"id\":1667228533,\"predicate\":\"phoneConnectionWebrtc\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"turn\",\"type\":\"flags.0?true\"},{\"name\":\"stun\",\"type\":\"flags.1?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"ip\",\"type\":\"string\"},{\"name\":\"ipv6\",\"type\":\"string\"},{\"name\":\"port\",\"type\":\"int\"},{\"name\":\"username\",\"type\":\"string\"},{\"name\":\"password\",\"type\":\"string\"}],\"type\":\"PhoneConnection\"},{\"id\":-58224696,\"predicate\":\"phoneCallProtocol\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"udp_p2p\",\"type\":\"flags.0?true\"},{\"name\":\"udp_reflector\",\"type\":\"flags.1?true\"},{\"name\":\"min_layer\",\"type\":\"int\"},{\"name\":\"max_layer\",\"type\":\"int\"},{\"name\":\"library_versions\",\"type\":\"Vector<string>\"}],\"type\":\"PhoneCallProtocol\"},{\"id\":-326966976,\"predicate\":\"phone.phoneCall\",\"params\":[{\"name\":\"phone_call\",\"type\":\"PhoneCall\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"phone.PhoneCall\"},{\"id\":-290921362,\"predicate\":\"upload.cdnFileReuploadNeeded\",\"params\":[{\"name\":\"request_token\",\"type\":\"bytes\"}],\"type\":\"upload.CdnFile\"},{\"id\":-1449145777,\"predicate\":\"upload.cdnFile\",\"params\":[{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"upload.CdnFile\"},{\"id\":-914167110,\"predicate\":\"cdnPublicKey\",\"params\":[{\"name\":\"dc_id\",\"type\":\"int\"},{\"name\":\"public_key\",\"type\":\"string\"}],\"type\":\"CdnPublicKey\"},{\"id\":1462101002,\"predicate\":\"cdnConfig\",\"params\":[{\"name\":\"public_keys\",\"type\":\"Vector<CdnPublicKey>\"}],\"type\":\"CdnConfig\"},{\"id\":-892239370,\"predicate\":\"langPackString\",\"params\":[{\"name\":\"key\",\"type\":\"string\"},{\"name\":\"value\",\"type\":\"string\"}],\"type\":\"LangPackString\"},{\"id\":1816636575,\"predicate\":\"langPackStringPluralized\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"key\",\"type\":\"string\"},{\"name\":\"zero_value\",\"type\":\"flags.0?string\"},{\"name\":\"one_value\",\"type\":\"flags.1?string\"},{\"name\":\"two_value\",\"type\":\"flags.2?string\"},{\"name\":\"few_value\",\"type\":\"flags.3?string\"},{\"name\":\"many_value\",\"type\":\"flags.4?string\"},{\"name\":\"other_value\",\"type\":\"string\"}],\"type\":\"LangPackString\"},{\"id\":695856818,\"predicate\":\"langPackStringDeleted\",\"params\":[{\"name\":\"key\",\"type\":\"string\"}],\"type\":\"LangPackString\"},{\"id\":-209337866,\"predicate\":\"langPackDifference\",\"params\":[{\"name\":\"lang_code\",\"type\":\"string\"},{\"name\":\"from_version\",\"type\":\"int\"},{\"name\":\"version\",\"type\":\"int\"},{\"name\":\"strings\",\"type\":\"Vector<LangPackString>\"}],\"type\":\"LangPackDifference\"},{\"id\":-288727837,\"predicate\":\"langPackLanguage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"official\",\"type\":\"flags.0?true\"},{\"name\":\"rtl\",\"type\":\"flags.2?true\"},{\"name\":\"beta\",\"type\":\"flags.3?true\"},{\"name\":\"name\",\"type\":\"string\"},{\"name\":\"native_name\",\"type\":\"string\"},{\"name\":\"lang_code\",\"type\":\"string\"},{\"name\":\"base_lang_code\",\"type\":\"flags.1?string\"},{\"name\":\"plural_code\",\"type\":\"string\"},{\"name\":\"strings_count\",\"type\":\"int\"},{\"name\":\"translated_count\",\"type\":\"int\"},{\"name\":\"translations_url\",\"type\":\"string\"}],\"type\":\"LangPackLanguage\"},{\"id\":-421545947,\"predicate\":\"channelAdminLogEventActionChangeTitle\",\"params\":[{\"name\":\"prev_value\",\"type\":\"string\"},{\"name\":\"new_value\",\"type\":\"string\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1427671598,\"predicate\":\"channelAdminLogEventActionChangeAbout\",\"params\":[{\"name\":\"prev_value\",\"type\":\"string\"},{\"name\":\"new_value\",\"type\":\"string\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1783299128,\"predicate\":\"channelAdminLogEventActionChangeUsername\",\"params\":[{\"name\":\"prev_value\",\"type\":\"string\"},{\"name\":\"new_value\",\"type\":\"string\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1129042607,\"predicate\":\"channelAdminLogEventActionChangePhoto\",\"params\":[{\"name\":\"prev_photo\",\"type\":\"Photo\"},{\"name\":\"new_photo\",\"type\":\"Photo\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":460916654,\"predicate\":\"channelAdminLogEventActionToggleInvites\",\"params\":[{\"name\":\"new_value\",\"type\":\"Bool\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":648939889,\"predicate\":\"channelAdminLogEventActionToggleSignatures\",\"params\":[{\"name\":\"new_value\",\"type\":\"Bool\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-370660328,\"predicate\":\"channelAdminLogEventActionUpdatePinned\",\"params\":[{\"name\":\"message\",\"type\":\"Message\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1889215493,\"predicate\":\"channelAdminLogEventActionEditMessage\",\"params\":[{\"name\":\"prev_message\",\"type\":\"Message\"},{\"name\":\"new_message\",\"type\":\"Message\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1121994683,\"predicate\":\"channelAdminLogEventActionDeleteMessage\",\"params\":[{\"name\":\"message\",\"type\":\"Message\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":405815507,\"predicate\":\"channelAdminLogEventActionParticipantJoin\",\"params\":[],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-124291086,\"predicate\":\"channelAdminLogEventActionParticipantLeave\",\"params\":[],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-484690728,\"predicate\":\"channelAdminLogEventActionParticipantInvite\",\"params\":[{\"name\":\"participant\",\"type\":\"ChannelParticipant\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-422036098,\"predicate\":\"channelAdminLogEventActionParticipantToggleBan\",\"params\":[{\"name\":\"prev_participant\",\"type\":\"ChannelParticipant\"},{\"name\":\"new_participant\",\"type\":\"ChannelParticipant\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-714643696,\"predicate\":\"channelAdminLogEventActionParticipantToggleAdmin\",\"params\":[{\"name\":\"prev_participant\",\"type\":\"ChannelParticipant\"},{\"name\":\"new_participant\",\"type\":\"ChannelParticipant\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-1312568665,\"predicate\":\"channelAdminLogEventActionChangeStickerSet\",\"params\":[{\"name\":\"prev_stickerset\",\"type\":\"InputStickerSet\"},{\"name\":\"new_stickerset\",\"type\":\"InputStickerSet\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1599903217,\"predicate\":\"channelAdminLogEventActionTogglePreHistoryHidden\",\"params\":[{\"name\":\"new_value\",\"type\":\"Bool\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":771095562,\"predicate\":\"channelAdminLogEventActionDefaultBannedRights\",\"params\":[{\"name\":\"prev_banned_rights\",\"type\":\"ChatBannedRights\"},{\"name\":\"new_banned_rights\",\"type\":\"ChatBannedRights\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-1895328189,\"predicate\":\"channelAdminLogEventActionStopPoll\",\"params\":[{\"name\":\"message\",\"type\":\"Message\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":84703944,\"predicate\":\"channelAdminLogEventActionChangeLinkedChat\",\"params\":[{\"name\":\"prev_value\",\"type\":\"long\"},{\"name\":\"new_value\",\"type\":\"long\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":241923758,\"predicate\":\"channelAdminLogEventActionChangeLocation\",\"params\":[{\"name\":\"prev_value\",\"type\":\"ChannelLocation\"},{\"name\":\"new_value\",\"type\":\"ChannelLocation\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1401984889,\"predicate\":\"channelAdminLogEventActionToggleSlowMode\",\"params\":[{\"name\":\"prev_value\",\"type\":\"int\"},{\"name\":\"new_value\",\"type\":\"int\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":589338437,\"predicate\":\"channelAdminLogEventActionStartGroupCall\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-610299584,\"predicate\":\"channelAdminLogEventActionDiscardGroupCall\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-115071790,\"predicate\":\"channelAdminLogEventActionParticipantMute\",\"params\":[{\"name\":\"participant\",\"type\":\"GroupCallParticipant\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-431740480,\"predicate\":\"channelAdminLogEventActionParticipantUnmute\",\"params\":[{\"name\":\"participant\",\"type\":\"GroupCallParticipant\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1456906823,\"predicate\":\"channelAdminLogEventActionToggleGroupCallSetting\",\"params\":[{\"name\":\"join_muted\",\"type\":\"Bool\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1557846647,\"predicate\":\"channelAdminLogEventActionParticipantJoinByInvite\",\"params\":[{\"name\":\"invite\",\"type\":\"ExportedChatInvite\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1515256996,\"predicate\":\"channelAdminLogEventActionExportedInviteDelete\",\"params\":[{\"name\":\"invite\",\"type\":\"ExportedChatInvite\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1091179342,\"predicate\":\"channelAdminLogEventActionExportedInviteRevoke\",\"params\":[{\"name\":\"invite\",\"type\":\"ExportedChatInvite\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-384910503,\"predicate\":\"channelAdminLogEventActionExportedInviteEdit\",\"params\":[{\"name\":\"prev_invite\",\"type\":\"ExportedChatInvite\"},{\"name\":\"new_invite\",\"type\":\"ExportedChatInvite\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1048537159,\"predicate\":\"channelAdminLogEventActionParticipantVolume\",\"params\":[{\"name\":\"participant\",\"type\":\"GroupCallParticipant\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1855199800,\"predicate\":\"channelAdminLogEventActionChangeHistoryTTL\",\"params\":[{\"name\":\"prev_value\",\"type\":\"int\"},{\"name\":\"new_value\",\"type\":\"int\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-1347021750,\"predicate\":\"channelAdminLogEventActionParticipantJoinByRequest\",\"params\":[{\"name\":\"invite\",\"type\":\"ExportedChatInvite\"},{\"name\":\"approved_by\",\"type\":\"long\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-886388890,\"predicate\":\"channelAdminLogEventActionToggleNoForwards\",\"params\":[{\"name\":\"new_value\",\"type\":\"Bool\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":663693416,\"predicate\":\"channelAdminLogEventActionSendMessage\",\"params\":[{\"name\":\"message\",\"type\":\"Message\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-1661470870,\"predicate\":\"channelAdminLogEventActionChangeAvailableReactions\",\"params\":[{\"name\":\"prev_value\",\"type\":\"Vector<string>\"},{\"name\":\"new_value\",\"type\":\"Vector<string>\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":531458253,\"predicate\":\"channelAdminLogEvent\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"action\",\"type\":\"ChannelAdminLogEventAction\"}],\"type\":\"ChannelAdminLogEvent\"},{\"id\":-309659827,\"predicate\":\"channels.adminLogResults\",\"params\":[{\"name\":\"events\",\"type\":\"Vector<ChannelAdminLogEvent>\"},{\"name\":\"chats\",\"type\":\"Vector<Chat>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"channels.AdminLogResults\"},{\"id\":-368018716,\"predicate\":\"channelAdminLogEventsFilter\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"join\",\"type\":\"flags.0?true\"},{\"name\":\"leave\",\"type\":\"flags.1?true\"},{\"name\":\"invite\",\"type\":\"flags.2?true\"},{\"name\":\"ban\",\"type\":\"flags.3?true\"},{\"name\":\"unban\",\"type\":\"flags.4?true\"},{\"name\":\"kick\",\"type\":\"flags.5?true\"},{\"name\":\"unkick\",\"type\":\"flags.6?true\"},{\"name\":\"promote\",\"type\":\"flags.7?true\"},{\"name\":\"demote\",\"type\":\"flags.8?true\"},{\"name\":\"info\",\"type\":\"flags.9?true\"},{\"name\":\"settings\",\"type\":\"flags.10?true\"},{\"name\":\"pinned\",\"type\":\"flags.11?true\"},{\"name\":\"edit\",\"type\":\"flags.12?true\"},{\"name\":\"delete\",\"type\":\"flags.13?true\"},{\"name\":\"group_call\",\"type\":\"flags.14?true\"},{\"name\":\"invites\",\"type\":\"flags.15?true\"},{\"name\":\"send\",\"type\":\"flags.16?true\"}],\"type\":\"ChannelAdminLogEventsFilter\"},{\"id\":1558266229,\"predicate\":\"popularContact\",\"params\":[{\"name\":\"client_id\",\"type\":\"long\"},{\"name\":\"importers\",\"type\":\"int\"}],\"type\":\"PopularContact\"},{\"id\":-1634752813,\"predicate\":\"messages.favedStickersNotModified\",\"params\":[],\"type\":\"messages.FavedStickers\"},{\"id\":750063767,\"predicate\":\"messages.favedStickers\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"packs\",\"type\":\"Vector<StickerPack>\"},{\"name\":\"stickers\",\"type\":\"Vector<Document>\"}],\"type\":\"messages.FavedStickers\"},{\"id\":1189204285,\"predicate\":\"recentMeUrlUnknown\",\"params\":[{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"RecentMeUrl\"},{\"id\":-1188296222,\"predicate\":\"recentMeUrlUser\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"user_id\",\"type\":\"long\"}],\"type\":\"RecentMeUrl\"},{\"id\":-1294306862,\"predicate\":\"recentMeUrlChat\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"chat_id\",\"type\":\"long\"}],\"type\":\"RecentMeUrl\"},{\"id\":-347535331,\"predicate\":\"recentMeUrlChatInvite\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"chat_invite\",\"type\":\"ChatInvite\"}],\"type\":\"RecentMeUrl\"},{\"id\":-1140172836,\"predicate\":\"recentMeUrlStickerSet\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"set\",\"type\":\"StickerSetCovered\"}],\"type\":\"RecentMeUrl\"},{\"id\":235081943,\"predicate\":\"help.recentMeUrls\",\"params\":[{\"name\":\"urls\",\"type\":\"Vector<RecentMeUrl>\"},{\"name\":\"chats\",\"type\":\"Vector<Chat>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"help.RecentMeUrls\"},{\"id\":482797855,\"predicate\":\"inputSingleMedia\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"media\",\"type\":\"InputMedia\"},{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"flags.0?Vector<MessageEntity>\"}],\"type\":\"InputSingleMedia\"},{\"id\":-1493633966,\"predicate\":\"webAuthorization\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"bot_id\",\"type\":\"long\"},{\"name\":\"domain\",\"type\":\"string\"},{\"name\":\"browser\",\"type\":\"string\"},{\"name\":\"platform\",\"type\":\"string\"},{\"name\":\"date_created\",\"type\":\"int\"},{\"name\":\"date_active\",\"type\":\"int\"},{\"name\":\"ip\",\"type\":\"string\"},{\"name\":\"region\",\"type\":\"string\"}],\"type\":\"WebAuthorization\"},{\"id\":-313079300,\"predicate\":\"account.webAuthorizations\",\"params\":[{\"name\":\"authorizations\",\"type\":\"Vector<WebAuthorization>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"account.WebAuthorizations\"},{\"id\":-1502174430,\"predicate\":\"inputMessageID\",\"params\":[{\"name\":\"id\",\"type\":\"int\"}],\"type\":\"InputMessage\"},{\"id\":-1160215659,\"predicate\":\"inputMessageReplyTo\",\"params\":[{\"name\":\"id\",\"type\":\"int\"}],\"type\":\"InputMessage\"},{\"id\":-2037963464,\"predicate\":\"inputMessagePinned\",\"params\":[],\"type\":\"InputMessage\"},{\"id\":-1392895362,\"predicate\":\"inputMessageCallbackQuery\",\"params\":[{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"query_id\",\"type\":\"long\"}],\"type\":\"InputMessage\"},{\"id\":-55902537,\"predicate\":\"inputDialogPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"InputDialogPeer\"},{\"id\":1684014375,\"predicate\":\"inputDialogPeerFolder\",\"params\":[{\"name\":\"folder_id\",\"type\":\"int\"}],\"type\":\"InputDialogPeer\"},{\"id\":-445792507,\"predicate\":\"dialogPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"}],\"type\":\"DialogPeer\"},{\"id\":1363483106,\"predicate\":\"dialogPeerFolder\",\"params\":[{\"name\":\"folder_id\",\"type\":\"int\"}],\"type\":\"DialogPeer\"},{\"id\":223655517,\"predicate\":\"messages.foundStickerSetsNotModified\",\"params\":[],\"type\":\"messages.FoundStickerSets\"},{\"id\":-1963942446,\"predicate\":\"messages.foundStickerSets\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"sets\",\"type\":\"Vector<StickerSetCovered>\"}],\"type\":\"messages.FoundStickerSets\"},{\"id\":1648543603,\"predicate\":\"fileHash\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"bytes\"}],\"type\":\"FileHash\"},{\"id\":1968737087,\"predicate\":\"inputClientProxy\",\"params\":[{\"name\":\"address\",\"type\":\"string\"},{\"name\":\"port\",\"type\":\"int\"}],\"type\":\"InputClientProxy\"},{\"id\":-483352705,\"predicate\":\"help.termsOfServiceUpdateEmpty\",\"params\":[{\"name\":\"expires\",\"type\":\"int\"}],\"type\":\"help.TermsOfServiceUpdate\"},{\"id\":686618977,\"predicate\":\"help.termsOfServiceUpdate\",\"params\":[{\"name\":\"expires\",\"type\":\"int\"},{\"name\":\"terms_of_service\",\"type\":\"help.TermsOfService\"}],\"type\":\"help.TermsOfServiceUpdate\"},{\"id\":859091184,\"predicate\":\"inputSecureFileUploaded\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"parts\",\"type\":\"int\"},{\"name\":\"md5_checksum\",\"type\":\"string\"},{\"name\":\"file_hash\",\"type\":\"bytes\"},{\"name\":\"secret\",\"type\":\"bytes\"}],\"type\":\"InputSecureFile\"},{\"id\":1399317950,\"predicate\":\"inputSecureFile\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputSecureFile\"},{\"id\":1679398724,\"predicate\":\"secureFileEmpty\",\"params\":[],\"type\":\"SecureFile\"},{\"id\":-534283678,\"predicate\":\"secureFile\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"size\",\"type\":\"int\"},{\"name\":\"dc_id\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"file_hash\",\"type\":\"bytes\"},{\"name\":\"secret\",\"type\":\"bytes\"}],\"type\":\"SecureFile\"},{\"id\":-1964327229,\"predicate\":\"secureData\",\"params\":[{\"name\":\"data\",\"type\":\"bytes\"},{\"name\":\"data_hash\",\"type\":\"bytes\"},{\"name\":\"secret\",\"type\":\"bytes\"}],\"type\":\"SecureData\"},{\"id\":2103482845,\"predicate\":\"securePlainPhone\",\"params\":[{\"name\":\"phone\",\"type\":\"string\"}],\"type\":\"SecurePlainData\"},{\"id\":569137759,\"predicate\":\"securePlainEmail\",\"params\":[{\"name\":\"email\",\"type\":\"string\"}],\"type\":\"SecurePlainData\"},{\"id\":-1658158621,\"predicate\":\"secureValueTypePersonalDetails\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":1034709504,\"predicate\":\"secureValueTypePassport\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":115615172,\"predicate\":\"secureValueTypeDriverLicense\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":-1596951477,\"predicate\":\"secureValueTypeIdentityCard\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":-1717268701,\"predicate\":\"secureValueTypeInternalPassport\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":-874308058,\"predicate\":\"secureValueTypeAddress\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":-63531698,\"predicate\":\"secureValueTypeUtilityBill\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":-1995211763,\"predicate\":\"secureValueTypeBankStatement\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":-1954007928,\"predicate\":\"secureValueTypeRentalAgreement\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":-1713143702,\"predicate\":\"secureValueTypePassportRegistration\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":-368907213,\"predicate\":\"secureValueTypeTemporaryRegistration\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":-1289704741,\"predicate\":\"secureValueTypePhone\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":-1908627474,\"predicate\":\"secureValueTypeEmail\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":411017418,\"predicate\":\"secureValue\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"data\",\"type\":\"flags.0?SecureData\"},{\"name\":\"front_side\",\"type\":\"flags.1?SecureFile\"},{\"name\":\"reverse_side\",\"type\":\"flags.2?SecureFile\"},{\"name\":\"selfie\",\"type\":\"flags.3?SecureFile\"},{\"name\":\"translation\",\"type\":\"flags.6?Vector<SecureFile>\"},{\"name\":\"files\",\"type\":\"flags.4?Vector<SecureFile>\"},{\"name\":\"plain_data\",\"type\":\"flags.5?SecurePlainData\"},{\"name\":\"hash\",\"type\":\"bytes\"}],\"type\":\"SecureValue\"},{\"id\":-618540889,\"predicate\":\"inputSecureValue\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"data\",\"type\":\"flags.0?SecureData\"},{\"name\":\"front_side\",\"type\":\"flags.1?InputSecureFile\"},{\"name\":\"reverse_side\",\"type\":\"flags.2?InputSecureFile\"},{\"name\":\"selfie\",\"type\":\"flags.3?InputSecureFile\"},{\"name\":\"translation\",\"type\":\"flags.6?Vector<InputSecureFile>\"},{\"name\":\"files\",\"type\":\"flags.4?Vector<InputSecureFile>\"},{\"name\":\"plain_data\",\"type\":\"flags.5?SecurePlainData\"}],\"type\":\"InputSecureValue\"},{\"id\":-316748368,\"predicate\":\"secureValueHash\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"hash\",\"type\":\"bytes\"}],\"type\":\"SecureValueHash\"},{\"id\":-391902247,\"predicate\":\"secureValueErrorData\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"data_hash\",\"type\":\"bytes\"},{\"name\":\"field\",\"type\":\"string\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"SecureValueError\"},{\"id\":12467706,\"predicate\":\"secureValueErrorFrontSide\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"file_hash\",\"type\":\"bytes\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"SecureValueError\"},{\"id\":-2037765467,\"predicate\":\"secureValueErrorReverseSide\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"file_hash\",\"type\":\"bytes\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"SecureValueError\"},{\"id\":-449327402,\"predicate\":\"secureValueErrorSelfie\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"file_hash\",\"type\":\"bytes\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"SecureValueError\"},{\"id\":2054162547,\"predicate\":\"secureValueErrorFile\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"file_hash\",\"type\":\"bytes\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"SecureValueError\"},{\"id\":1717706985,\"predicate\":\"secureValueErrorFiles\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"file_hash\",\"type\":\"Vector<bytes>\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"SecureValueError\"},{\"id\":-2036501105,\"predicate\":\"secureValueError\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"hash\",\"type\":\"bytes\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"SecureValueError\"},{\"id\":-1592506512,\"predicate\":\"secureValueErrorTranslationFile\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"file_hash\",\"type\":\"bytes\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"SecureValueError\"},{\"id\":878931416,\"predicate\":\"secureValueErrorTranslationFiles\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"file_hash\",\"type\":\"Vector<bytes>\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"SecureValueError\"},{\"id\":871426631,\"predicate\":\"secureCredentialsEncrypted\",\"params\":[{\"name\":\"data\",\"type\":\"bytes\"},{\"name\":\"hash\",\"type\":\"bytes\"},{\"name\":\"secret\",\"type\":\"bytes\"}],\"type\":\"SecureCredentialsEncrypted\"},{\"id\":-1389486888,\"predicate\":\"account.authorizationForm\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"required_types\",\"type\":\"Vector<SecureRequiredType>\"},{\"name\":\"values\",\"type\":\"Vector<SecureValue>\"},{\"name\":\"errors\",\"type\":\"Vector<SecureValueError>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"},{\"name\":\"privacy_policy_url\",\"type\":\"flags.0?string\"}],\"type\":\"account.AuthorizationForm\"},{\"id\":-2128640689,\"predicate\":\"account.sentEmailCode\",\"params\":[{\"name\":\"email_pattern\",\"type\":\"string\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"account.SentEmailCode\"},{\"id\":1722786150,\"predicate\":\"help.deepLinkInfoEmpty\",\"params\":[],\"type\":\"help.DeepLinkInfo\"},{\"id\":1783556146,\"predicate\":\"help.deepLinkInfo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"update_app\",\"type\":\"flags.0?true\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"flags.1?Vector<MessageEntity>\"}],\"type\":\"help.DeepLinkInfo\"},{\"id\":289586518,\"predicate\":\"savedPhoneContact\",\"params\":[{\"name\":\"phone\",\"type\":\"string\"},{\"name\":\"first_name\",\"type\":\"string\"},{\"name\":\"last_name\",\"type\":\"string\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"SavedContact\"},{\"id\":1304052993,\"predicate\":\"account.takeout\",\"params\":[{\"name\":\"id\",\"type\":\"long\"}],\"type\":\"account.Takeout\"},{\"id\":-732254058,\"predicate\":\"passwordKdfAlgoUnknown\",\"params\":[],\"type\":\"PasswordKdfAlgo\"},{\"id\":982592842,\"predicate\":\"passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow\",\"params\":[{\"name\":\"salt1\",\"type\":\"bytes\"},{\"name\":\"salt2\",\"type\":\"bytes\"},{\"name\":\"g\",\"type\":\"int\"},{\"name\":\"p\",\"type\":\"bytes\"}],\"type\":\"PasswordKdfAlgo\"},{\"id\":4883767,\"predicate\":\"securePasswordKdfAlgoUnknown\",\"params\":[],\"type\":\"SecurePasswordKdfAlgo\"},{\"id\":-1141711456,\"predicate\":\"securePasswordKdfAlgoPBKDF2HMACSHA512iter100000\",\"params\":[{\"name\":\"salt\",\"type\":\"bytes\"}],\"type\":\"SecurePasswordKdfAlgo\"},{\"id\":-2042159726,\"predicate\":\"securePasswordKdfAlgoSHA512\",\"params\":[{\"name\":\"salt\",\"type\":\"bytes\"}],\"type\":\"SecurePasswordKdfAlgo\"},{\"id\":354925740,\"predicate\":\"secureSecretSettings\",\"params\":[{\"name\":\"secure_algo\",\"type\":\"SecurePasswordKdfAlgo\"},{\"name\":\"secure_secret\",\"type\":\"bytes\"},{\"name\":\"secure_secret_id\",\"type\":\"long\"}],\"type\":\"SecureSecretSettings\"},{\"id\":-1736378792,\"predicate\":\"inputCheckPasswordEmpty\",\"params\":[],\"type\":\"InputCheckPasswordSRP\"},{\"id\":-763367294,\"predicate\":\"inputCheckPasswordSRP\",\"params\":[{\"name\":\"srp_id\",\"type\":\"long\"},{\"name\":\"A\",\"type\":\"bytes\"},{\"name\":\"M1\",\"type\":\"bytes\"}],\"type\":\"InputCheckPasswordSRP\"},{\"id\":-2103600678,\"predicate\":\"secureRequiredType\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"native_names\",\"type\":\"flags.0?true\"},{\"name\":\"selfie_required\",\"type\":\"flags.1?true\"},{\"name\":\"translation_required\",\"type\":\"flags.2?true\"},{\"name\":\"type\",\"type\":\"SecureValueType\"}],\"type\":\"SecureRequiredType\"},{\"id\":41187252,\"predicate\":\"secureRequiredTypeOneOf\",\"params\":[{\"name\":\"types\",\"type\":\"Vector<SecureRequiredType>\"}],\"type\":\"SecureRequiredType\"},{\"id\":-1078332329,\"predicate\":\"help.passportConfigNotModified\",\"params\":[],\"type\":\"help.PassportConfig\"},{\"id\":-1600596305,\"predicate\":\"help.passportConfig\",\"params\":[{\"name\":\"hash\",\"type\":\"int\"},{\"name\":\"countries_langs\",\"type\":\"DataJSON\"}],\"type\":\"help.PassportConfig\"},{\"id\":488313413,\"predicate\":\"inputAppEvent\",\"params\":[{\"name\":\"time\",\"type\":\"double\"},{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"peer\",\"type\":\"long\"},{\"name\":\"data\",\"type\":\"JSONValue\"}],\"type\":\"InputAppEvent\"},{\"id\":-1059185703,\"predicate\":\"jsonObjectValue\",\"params\":[{\"name\":\"key\",\"type\":\"string\"},{\"name\":\"value\",\"type\":\"JSONValue\"}],\"type\":\"JSONObjectValue\"},{\"id\":1064139624,\"predicate\":\"jsonNull\",\"params\":[],\"type\":\"JSONValue\"},{\"id\":-952869270,\"predicate\":\"jsonBool\",\"params\":[{\"name\":\"value\",\"type\":\"Bool\"}],\"type\":\"JSONValue\"},{\"id\":736157604,\"predicate\":\"jsonNumber\",\"params\":[{\"name\":\"value\",\"type\":\"double\"}],\"type\":\"JSONValue\"},{\"id\":-1222740358,\"predicate\":\"jsonString\",\"params\":[{\"name\":\"value\",\"type\":\"string\"}],\"type\":\"JSONValue\"},{\"id\":-146520221,\"predicate\":\"jsonArray\",\"params\":[{\"name\":\"value\",\"type\":\"Vector<JSONValue>\"}],\"type\":\"JSONValue\"},{\"id\":-1715350371,\"predicate\":\"jsonObject\",\"params\":[{\"name\":\"value\",\"type\":\"Vector<JSONObjectValue>\"}],\"type\":\"JSONValue\"},{\"id\":878078826,\"predicate\":\"pageTableCell\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"header\",\"type\":\"flags.0?true\"},{\"name\":\"align_center\",\"type\":\"flags.3?true\"},{\"name\":\"align_right\",\"type\":\"flags.4?true\"},{\"name\":\"valign_middle\",\"type\":\"flags.5?true\"},{\"name\":\"valign_bottom\",\"type\":\"flags.6?true\"},{\"name\":\"text\",\"type\":\"flags.7?RichText\"},{\"name\":\"colspan\",\"type\":\"flags.1?int\"},{\"name\":\"rowspan\",\"type\":\"flags.2?int\"}],\"type\":\"PageTableCell\"},{\"id\":-524237339,\"predicate\":\"pageTableRow\",\"params\":[{\"name\":\"cells\",\"type\":\"Vector<PageTableCell>\"}],\"type\":\"PageTableRow\"},{\"id\":1869903447,\"predicate\":\"pageCaption\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"},{\"name\":\"credit\",\"type\":\"RichText\"}],\"type\":\"PageCaption\"},{\"id\":-1188055347,\"predicate\":\"pageListItemText\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"PageListItem\"},{\"id\":635466748,\"predicate\":\"pageListItemBlocks\",\"params\":[{\"name\":\"blocks\",\"type\":\"Vector<PageBlock>\"}],\"type\":\"PageListItem\"},{\"id\":1577484359,\"predicate\":\"pageListOrderedItemText\",\"params\":[{\"name\":\"num\",\"type\":\"string\"},{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"PageListOrderedItem\"},{\"id\":-1730311882,\"predicate\":\"pageListOrderedItemBlocks\",\"params\":[{\"name\":\"num\",\"type\":\"string\"},{\"name\":\"blocks\",\"type\":\"Vector<PageBlock>\"}],\"type\":\"PageListOrderedItem\"},{\"id\":-1282352120,\"predicate\":\"pageRelatedArticle\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"webpage_id\",\"type\":\"long\"},{\"name\":\"title\",\"type\":\"flags.0?string\"},{\"name\":\"description\",\"type\":\"flags.1?string\"},{\"name\":\"photo_id\",\"type\":\"flags.2?long\"},{\"name\":\"author\",\"type\":\"flags.3?string\"},{\"name\":\"published_date\",\"type\":\"flags.4?int\"}],\"type\":\"PageRelatedArticle\"},{\"id\":-1738178803,\"predicate\":\"page\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"part\",\"type\":\"flags.0?true\"},{\"name\":\"rtl\",\"type\":\"flags.1?true\"},{\"name\":\"v2\",\"type\":\"flags.2?true\"},{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"blocks\",\"type\":\"Vector<PageBlock>\"},{\"name\":\"photos\",\"type\":\"Vector<Photo>\"},{\"name\":\"documents\",\"type\":\"Vector<Document>\"},{\"name\":\"views\",\"type\":\"flags.3?int\"}],\"type\":\"Page\"},{\"id\":-1945767479,\"predicate\":\"help.supportName\",\"params\":[{\"name\":\"name\",\"type\":\"string\"}],\"type\":\"help.SupportName\"},{\"id\":-206688531,\"predicate\":\"help.userInfoEmpty\",\"params\":[],\"type\":\"help.UserInfo\"},{\"id\":32192344,\"predicate\":\"help.userInfo\",\"params\":[{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"Vector<MessageEntity>\"},{\"name\":\"author\",\"type\":\"string\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"help.UserInfo\"},{\"id\":1823064809,\"predicate\":\"pollAnswer\",\"params\":[{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"option\",\"type\":\"bytes\"}],\"type\":\"PollAnswer\"},{\"id\":-2032041631,\"predicate\":\"poll\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"closed\",\"type\":\"flags.0?true\"},{\"name\":\"public_voters\",\"type\":\"flags.1?true\"},{\"name\":\"multiple_choice\",\"type\":\"flags.2?true\"},{\"name\":\"quiz\",\"type\":\"flags.3?true\"},{\"name\":\"question\",\"type\":\"string\"},{\"name\":\"answers\",\"type\":\"Vector<PollAnswer>\"},{\"name\":\"close_period\",\"type\":\"flags.4?int\"},{\"name\":\"close_date\",\"type\":\"flags.5?int\"}],\"type\":\"Poll\"},{\"id\":997055186,\"predicate\":\"pollAnswerVoters\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"chosen\",\"type\":\"flags.0?true\"},{\"name\":\"correct\",\"type\":\"flags.1?true\"},{\"name\":\"option\",\"type\":\"bytes\"},{\"name\":\"voters\",\"type\":\"int\"}],\"type\":\"PollAnswerVoters\"},{\"id\":-591909213,\"predicate\":\"pollResults\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"min\",\"type\":\"flags.0?true\"},{\"name\":\"results\",\"type\":\"flags.1?Vector<PollAnswerVoters>\"},{\"name\":\"total_voters\",\"type\":\"flags.2?int\"},{\"name\":\"recent_voters\",\"type\":\"flags.3?Vector<long>\"},{\"name\":\"solution\",\"type\":\"flags.4?string\"},{\"name\":\"solution_entities\",\"type\":\"flags.4?Vector<MessageEntity>\"}],\"type\":\"PollResults\"},{\"id\":-264117680,\"predicate\":\"chatOnlines\",\"params\":[{\"name\":\"onlines\",\"type\":\"int\"}],\"type\":\"ChatOnlines\"},{\"id\":1202287072,\"predicate\":\"statsURL\",\"params\":[{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"StatsURL\"},{\"id\":1605510357,\"predicate\":\"chatAdminRights\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"change_info\",\"type\":\"flags.0?true\"},{\"name\":\"post_messages\",\"type\":\"flags.1?true\"},{\"name\":\"edit_messages\",\"type\":\"flags.2?true\"},{\"name\":\"delete_messages\",\"type\":\"flags.3?true\"},{\"name\":\"ban_users\",\"type\":\"flags.4?true\"},{\"name\":\"invite_users\",\"type\":\"flags.5?true\"},{\"name\":\"pin_messages\",\"type\":\"flags.7?true\"},{\"name\":\"add_admins\",\"type\":\"flags.9?true\"},{\"name\":\"anonymous\",\"type\":\"flags.10?true\"},{\"name\":\"manage_call\",\"type\":\"flags.11?true\"},{\"name\":\"other\",\"type\":\"flags.12?true\"}],\"type\":\"ChatAdminRights\"},{\"id\":-1626209256,\"predicate\":\"chatBannedRights\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"view_messages\",\"type\":\"flags.0?true\"},{\"name\":\"send_messages\",\"type\":\"flags.1?true\"},{\"name\":\"send_media\",\"type\":\"flags.2?true\"},{\"name\":\"send_stickers\",\"type\":\"flags.3?true\"},{\"name\":\"send_gifs\",\"type\":\"flags.4?true\"},{\"name\":\"send_games\",\"type\":\"flags.5?true\"},{\"name\":\"send_inline\",\"type\":\"flags.6?true\"},{\"name\":\"embed_links\",\"type\":\"flags.7?true\"},{\"name\":\"send_polls\",\"type\":\"flags.8?true\"},{\"name\":\"change_info\",\"type\":\"flags.10?true\"},{\"name\":\"invite_users\",\"type\":\"flags.15?true\"},{\"name\":\"pin_messages\",\"type\":\"flags.17?true\"},{\"name\":\"until_date\",\"type\":\"int\"}],\"type\":\"ChatBannedRights\"},{\"id\":-433014407,\"predicate\":\"inputWallPaper\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputWallPaper\"},{\"id\":1913199744,\"predicate\":\"inputWallPaperSlug\",\"params\":[{\"name\":\"slug\",\"type\":\"string\"}],\"type\":\"InputWallPaper\"},{\"id\":-1770371538,\"predicate\":\"inputWallPaperNoFile\",\"params\":[{\"name\":\"id\",\"type\":\"long\"}],\"type\":\"InputWallPaper\"},{\"id\":471437699,\"predicate\":\"account.wallPapersNotModified\",\"params\":[],\"type\":\"account.WallPapers\"},{\"id\":-842824308,\"predicate\":\"account.wallPapers\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"wallpapers\",\"type\":\"Vector<WallPaper>\"}],\"type\":\"account.WallPapers\"},{\"id\":-1973130814,\"predicate\":\"codeSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"allow_flashcall\",\"type\":\"flags.0?true\"},{\"name\":\"current_number\",\"type\":\"flags.1?true\"},{\"name\":\"allow_app_hash\",\"type\":\"flags.4?true\"},{\"name\":\"allow_missed_call\",\"type\":\"flags.5?true\"},{\"name\":\"logout_tokens\",\"type\":\"flags.6?Vector<bytes>\"}],\"type\":\"CodeSettings\"},{\"id\":499236004,\"predicate\":\"wallPaperSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"blur\",\"type\":\"flags.1?true\"},{\"name\":\"motion\",\"type\":\"flags.2?true\"},{\"name\":\"background_color\",\"type\":\"flags.0?int\"},{\"name\":\"second_background_color\",\"type\":\"flags.4?int\"},{\"name\":\"third_background_color\",\"type\":\"flags.5?int\"},{\"name\":\"fourth_background_color\",\"type\":\"flags.6?int\"},{\"name\":\"intensity\",\"type\":\"flags.3?int\"},{\"name\":\"rotation\",\"type\":\"flags.4?int\"}],\"type\":\"WallPaperSettings\"},{\"id\":-532532493,\"predicate\":\"autoDownloadSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"disabled\",\"type\":\"flags.0?true\"},{\"name\":\"video_preload_large\",\"type\":\"flags.1?true\"},{\"name\":\"audio_preload_next\",\"type\":\"flags.2?true\"},{\"name\":\"phonecalls_less_data\",\"type\":\"flags.3?true\"},{\"name\":\"photo_size_max\",\"type\":\"int\"},{\"name\":\"video_size_max\",\"type\":\"int\"},{\"name\":\"file_size_max\",\"type\":\"int\"},{\"name\":\"video_upload_maxbitrate\",\"type\":\"int\"}],\"type\":\"AutoDownloadSettings\"},{\"id\":1674235686,\"predicate\":\"account.autoDownloadSettings\",\"params\":[{\"name\":\"low\",\"type\":\"AutoDownloadSettings\"},{\"name\":\"medium\",\"type\":\"AutoDownloadSettings\"},{\"name\":\"high\",\"type\":\"AutoDownloadSettings\"}],\"type\":\"account.AutoDownloadSettings\"},{\"id\":-709641735,\"predicate\":\"emojiKeyword\",\"params\":[{\"name\":\"keyword\",\"type\":\"string\"},{\"name\":\"emoticons\",\"type\":\"Vector<string>\"}],\"type\":\"EmojiKeyword\"},{\"id\":594408994,\"predicate\":\"emojiKeywordDeleted\",\"params\":[{\"name\":\"keyword\",\"type\":\"string\"},{\"name\":\"emoticons\",\"type\":\"Vector<string>\"}],\"type\":\"EmojiKeyword\"},{\"id\":1556570557,\"predicate\":\"emojiKeywordsDifference\",\"params\":[{\"name\":\"lang_code\",\"type\":\"string\"},{\"name\":\"from_version\",\"type\":\"int\"},{\"name\":\"version\",\"type\":\"int\"},{\"name\":\"keywords\",\"type\":\"Vector<EmojiKeyword>\"}],\"type\":\"EmojiKeywordsDifference\"},{\"id\":-1519029347,\"predicate\":\"emojiURL\",\"params\":[{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"EmojiURL\"},{\"id\":-1275374751,\"predicate\":\"emojiLanguage\",\"params\":[{\"name\":\"lang_code\",\"type\":\"string\"}],\"type\":\"EmojiLanguage\"},{\"id\":-11252123,\"predicate\":\"folder\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"autofill_new_broadcasts\",\"type\":\"flags.0?true\"},{\"name\":\"autofill_public_groups\",\"type\":\"flags.1?true\"},{\"name\":\"autofill_new_correspondents\",\"type\":\"flags.2?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"flags.3?ChatPhoto\"}],\"type\":\"Folder\"},{\"id\":-70073706,\"predicate\":\"inputFolderPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"folder_id\",\"type\":\"int\"}],\"type\":\"InputFolderPeer\"},{\"id\":-373643672,\"predicate\":\"folderPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"folder_id\",\"type\":\"int\"}],\"type\":\"FolderPeer\"},{\"id\":-398136321,\"predicate\":\"messages.searchCounter\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"inexact\",\"type\":\"flags.1?true\"},{\"name\":\"filter\",\"type\":\"MessagesFilter\"},{\"name\":\"count\",\"type\":\"int\"}],\"type\":\"messages.SearchCounter\"},{\"id\":-1831650802,\"predicate\":\"urlAuthResultRequest\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"request_write_access\",\"type\":\"flags.0?true\"},{\"name\":\"bot\",\"type\":\"User\"},{\"name\":\"domain\",\"type\":\"string\"}],\"type\":\"UrlAuthResult\"},{\"id\":-1886646706,\"predicate\":\"urlAuthResultAccepted\",\"params\":[{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"UrlAuthResult\"},{\"id\":-1445536993,\"predicate\":\"urlAuthResultDefault\",\"params\":[],\"type\":\"UrlAuthResult\"},{\"id\":-1078612597,\"predicate\":\"channelLocationEmpty\",\"params\":[],\"type\":\"ChannelLocation\"},{\"id\":547062491,\"predicate\":\"channelLocation\",\"params\":[{\"name\":\"geo_point\",\"type\":\"GeoPoint\"},{\"name\":\"address\",\"type\":\"string\"}],\"type\":\"ChannelLocation\"},{\"id\":-901375139,\"predicate\":\"peerLocated\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"expires\",\"type\":\"int\"},{\"name\":\"distance\",\"type\":\"int\"}],\"type\":\"PeerLocated\"},{\"id\":-118740917,\"predicate\":\"peerSelfLocated\",\"params\":[{\"name\":\"expires\",\"type\":\"int\"}],\"type\":\"PeerLocated\"},{\"id\":-797791052,\"predicate\":\"restrictionReason\",\"params\":[{\"name\":\"platform\",\"type\":\"string\"},{\"name\":\"reason\",\"type\":\"string\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"RestrictionReason\"},{\"id\":1012306921,\"predicate\":\"inputTheme\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputTheme\"},{\"id\":-175567375,\"predicate\":\"inputThemeSlug\",\"params\":[{\"name\":\"slug\",\"type\":\"string\"}],\"type\":\"InputTheme\"},{\"id\":-1609668650,\"predicate\":\"theme\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"creator\",\"type\":\"flags.0?true\"},{\"name\":\"default\",\"type\":\"flags.1?true\"},{\"name\":\"for_chat\",\"type\":\"flags.5?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"slug\",\"type\":\"string\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"document\",\"type\":\"flags.2?Document\"},{\"name\":\"settings\",\"type\":\"flags.3?Vector<ThemeSettings>\"},{\"name\":\"emoticon\",\"type\":\"flags.6?string\"},{\"name\":\"installs_count\",\"type\":\"flags.4?int\"}],\"type\":\"Theme\"},{\"id\":-199313886,\"predicate\":\"account.themesNotModified\",\"params\":[],\"type\":\"account.Themes\"},{\"id\":-1707242387,\"predicate\":\"account.themes\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"themes\",\"type\":\"Vector<Theme>\"}],\"type\":\"account.Themes\"},{\"id\":1654593920,\"predicate\":\"auth.loginToken\",\"params\":[{\"name\":\"expires\",\"type\":\"int\"},{\"name\":\"token\",\"type\":\"bytes\"}],\"type\":\"auth.LoginToken\"},{\"id\":110008598,\"predicate\":\"auth.loginTokenMigrateTo\",\"params\":[{\"name\":\"dc_id\",\"type\":\"int\"},{\"name\":\"token\",\"type\":\"bytes\"}],\"type\":\"auth.LoginToken\"},{\"id\":957176926,\"predicate\":\"auth.loginTokenSuccess\",\"params\":[{\"name\":\"authorization\",\"type\":\"auth.Authorization\"}],\"type\":\"auth.LoginToken\"},{\"id\":1474462241,\"predicate\":\"account.contentSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"sensitive_enabled\",\"type\":\"flags.0?true\"},{\"name\":\"sensitive_can_change\",\"type\":\"flags.1?true\"}],\"type\":\"account.ContentSettings\"},{\"id\":-1456996667,\"predicate\":\"messages.inactiveChats\",\"params\":[{\"name\":\"dates\",\"type\":\"Vector<int>\"},{\"name\":\"chats\",\"type\":\"Vector<Chat>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"messages.InactiveChats\"},{\"id\":-1012849566,\"predicate\":\"baseThemeClassic\",\"params\":[],\"type\":\"BaseTheme\"},{\"id\":-69724536,\"predicate\":\"baseThemeDay\",\"params\":[],\"type\":\"BaseTheme\"},{\"id\":-1212997976,\"predicate\":\"baseThemeNight\",\"params\":[],\"type\":\"BaseTheme\"},{\"id\":1834973166,\"predicate\":\"baseThemeTinted\",\"params\":[],\"type\":\"BaseTheme\"},{\"id\":1527845466,\"predicate\":\"baseThemeArctic\",\"params\":[],\"type\":\"BaseTheme\"},{\"id\":-1881255857,\"predicate\":\"inputThemeSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"message_colors_animated\",\"type\":\"flags.2?true\"},{\"name\":\"base_theme\",\"type\":\"BaseTheme\"},{\"name\":\"accent_color\",\"type\":\"int\"},{\"name\":\"outbox_accent_color\",\"type\":\"flags.3?int\"},{\"name\":\"message_colors\",\"type\":\"flags.0?Vector<int>\"},{\"name\":\"wallpaper\",\"type\":\"flags.1?InputWallPaper\"},{\"name\":\"wallpaper_settings\",\"type\":\"flags.1?WallPaperSettings\"}],\"type\":\"InputThemeSettings\"},{\"id\":-94849324,\"predicate\":\"themeSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"message_colors_animated\",\"type\":\"flags.2?true\"},{\"name\":\"base_theme\",\"type\":\"BaseTheme\"},{\"name\":\"accent_color\",\"type\":\"int\"},{\"name\":\"outbox_accent_color\",\"type\":\"flags.3?int\"},{\"name\":\"message_colors\",\"type\":\"flags.0?Vector<int>\"},{\"name\":\"wallpaper\",\"type\":\"flags.1?WallPaper\"}],\"type\":\"ThemeSettings\"},{\"id\":1421174295,\"predicate\":\"webPageAttributeTheme\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"documents\",\"type\":\"flags.0?Vector<Document>\"},{\"name\":\"settings\",\"type\":\"flags.1?ThemeSettings\"}],\"type\":\"WebPageAttribute\"},{\"id\":886196148,\"predicate\":\"messageUserVote\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"option\",\"type\":\"bytes\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"MessageUserVote\"},{\"id\":1017491692,\"predicate\":\"messageUserVoteInputOption\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"MessageUserVote\"},{\"id\":-1973033641,\"predicate\":\"messageUserVoteMultiple\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"options\",\"type\":\"Vector<bytes>\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"MessageUserVote\"},{\"id\":136574537,\"predicate\":\"messages.votesList\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"votes\",\"type\":\"Vector<MessageUserVote>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"},{\"name\":\"next_offset\",\"type\":\"flags.0?string\"}],\"type\":\"messages.VotesList\"},{\"id\":-177732982,\"predicate\":\"bankCardOpenUrl\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"name\",\"type\":\"string\"}],\"type\":\"BankCardOpenUrl\"},{\"id\":1042605427,\"predicate\":\"payments.bankCardData\",\"params\":[{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"open_urls\",\"type\":\"Vector<BankCardOpenUrl>\"}],\"type\":\"payments.BankCardData\"},{\"id\":1949890536,\"predicate\":\"dialogFilter\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"contacts\",\"type\":\"flags.0?true\"},{\"name\":\"non_contacts\",\"type\":\"flags.1?true\"},{\"name\":\"groups\",\"type\":\"flags.2?true\"},{\"name\":\"broadcasts\",\"type\":\"flags.3?true\"},{\"name\":\"bots\",\"type\":\"flags.4?true\"},{\"name\":\"exclude_muted\",\"type\":\"flags.11?true\"},{\"name\":\"exclude_read\",\"type\":\"flags.12?true\"},{\"name\":\"exclude_archived\",\"type\":\"flags.13?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"emoticon\",\"type\":\"flags.25?string\"},{\"name\":\"pinned_peers\",\"type\":\"Vector<InputPeer>\"},{\"name\":\"include_peers\",\"type\":\"Vector<InputPeer>\"},{\"name\":\"exclude_peers\",\"type\":\"Vector<InputPeer>\"}],\"type\":\"DialogFilter\"},{\"id\":2004110666,\"predicate\":\"dialogFilterSuggested\",\"params\":[{\"name\":\"filter\",\"type\":\"DialogFilter\"},{\"name\":\"description\",\"type\":\"string\"}],\"type\":\"DialogFilterSuggested\"},{\"id\":-1237848657,\"predicate\":\"statsDateRangeDays\",\"params\":[{\"name\":\"min_date\",\"type\":\"int\"},{\"name\":\"max_date\",\"type\":\"int\"}],\"type\":\"StatsDateRangeDays\"},{\"id\":-884757282,\"predicate\":\"statsAbsValueAndPrev\",\"params\":[{\"name\":\"current\",\"type\":\"double\"},{\"name\":\"previous\",\"type\":\"double\"}],\"type\":\"StatsAbsValueAndPrev\"},{\"id\":-875679776,\"predicate\":\"statsPercentValue\",\"params\":[{\"name\":\"part\",\"type\":\"double\"},{\"name\":\"total\",\"type\":\"double\"}],\"type\":\"StatsPercentValue\"},{\"id\":1244130093,\"predicate\":\"statsGraphAsync\",\"params\":[{\"name\":\"token\",\"type\":\"string\"}],\"type\":\"StatsGraph\"},{\"id\":-1092839390,\"predicate\":\"statsGraphError\",\"params\":[{\"name\":\"error\",\"type\":\"string\"}],\"type\":\"StatsGraph\"},{\"id\":-1901828938,\"predicate\":\"statsGraph\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"json\",\"type\":\"DataJSON\"},{\"name\":\"zoom_token\",\"type\":\"flags.0?string\"}],\"type\":\"StatsGraph\"},{\"id\":-1387279939,\"predicate\":\"messageInteractionCounters\",\"params\":[{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"views\",\"type\":\"int\"},{\"name\":\"forwards\",\"type\":\"int\"}],\"type\":\"MessageInteractionCounters\"},{\"id\":-1107852396,\"predicate\":\"stats.broadcastStats\",\"params\":[{\"name\":\"period\",\"type\":\"StatsDateRangeDays\"},{\"name\":\"followers\",\"type\":\"StatsAbsValueAndPrev\"},{\"name\":\"views_per_post\",\"type\":\"StatsAbsValueAndPrev\"},{\"name\":\"shares_per_post\",\"type\":\"StatsAbsValueAndPrev\"},{\"name\":\"enabled_notifications\",\"type\":\"StatsPercentValue\"},{\"name\":\"growth_graph\",\"type\":\"StatsGraph\"},{\"name\":\"followers_graph\",\"type\":\"StatsGraph\"},{\"name\":\"mute_graph\",\"type\":\"StatsGraph\"},{\"name\":\"top_hours_graph\",\"type\":\"StatsGraph\"},{\"name\":\"interactions_graph\",\"type\":\"StatsGraph\"},{\"name\":\"iv_interactions_graph\",\"type\":\"StatsGraph\"},{\"name\":\"views_by_source_graph\",\"type\":\"StatsGraph\"},{\"name\":\"new_followers_by_source_graph\",\"type\":\"StatsGraph\"},{\"name\":\"languages_graph\",\"type\":\"StatsGraph\"},{\"name\":\"recent_message_interactions\",\"type\":\"Vector<MessageInteractionCounters>\"}],\"type\":\"stats.BroadcastStats\"},{\"id\":-1728664459,\"predicate\":\"help.promoDataEmpty\",\"params\":[{\"name\":\"expires\",\"type\":\"int\"}],\"type\":\"help.PromoData\"},{\"id\":-1942390465,\"predicate\":\"help.promoData\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"proxy\",\"type\":\"flags.0?true\"},{\"name\":\"expires\",\"type\":\"int\"},{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"chats\",\"type\":\"Vector<Chat>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"},{\"name\":\"psa_type\",\"type\":\"flags.1?string\"},{\"name\":\"psa_message\",\"type\":\"flags.2?string\"}],\"type\":\"help.PromoData\"},{\"id\":-567037804,\"predicate\":\"videoSize\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"w\",\"type\":\"int\"},{\"name\":\"h\",\"type\":\"int\"},{\"name\":\"size\",\"type\":\"int\"},{\"name\":\"video_start_ts\",\"type\":\"flags.0?double\"}],\"type\":\"VideoSize\"},{\"id\":-1660637285,\"predicate\":\"statsGroupTopPoster\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"messages\",\"type\":\"int\"},{\"name\":\"avg_chars\",\"type\":\"int\"}],\"type\":\"StatsGroupTopPoster\"},{\"id\":-682079097,\"predicate\":\"statsGroupTopAdmin\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"deleted\",\"type\":\"int\"},{\"name\":\"kicked\",\"type\":\"int\"},{\"name\":\"banned\",\"type\":\"int\"}],\"type\":\"StatsGroupTopAdmin\"},{\"id\":1398765469,\"predicate\":\"statsGroupTopInviter\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"invitations\",\"type\":\"int\"}],\"type\":\"StatsGroupTopInviter\"},{\"id\":-276825834,\"predicate\":\"stats.megagroupStats\",\"params\":[{\"name\":\"period\",\"type\":\"StatsDateRangeDays\"},{\"name\":\"members\",\"type\":\"StatsAbsValueAndPrev\"},{\"name\":\"messages\",\"type\":\"StatsAbsValueAndPrev\"},{\"name\":\"viewers\",\"type\":\"StatsAbsValueAndPrev\"},{\"name\":\"posters\",\"type\":\"StatsAbsValueAndPrev\"},{\"name\":\"growth_graph\",\"type\":\"StatsGraph\"},{\"name\":\"members_graph\",\"type\":\"StatsGraph\"},{\"name\":\"new_members_by_source_graph\",\"type\":\"StatsGraph\"},{\"name\":\"languages_graph\",\"type\":\"StatsGraph\"},{\"name\":\"messages_graph\",\"type\":\"StatsGraph\"},{\"name\":\"actions_graph\",\"type\":\"StatsGraph\"},{\"name\":\"top_hours_graph\",\"type\":\"StatsGraph\"},{\"name\":\"weekdays_graph\",\"type\":\"StatsGraph\"},{\"name\":\"top_posters\",\"type\":\"Vector<StatsGroupTopPoster>\"},{\"name\":\"top_admins\",\"type\":\"Vector<StatsGroupTopAdmin>\"},{\"name\":\"top_inviters\",\"type\":\"Vector<StatsGroupTopInviter>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"stats.MegagroupStats\"},{\"id\":-1096616924,\"predicate\":\"globalPrivacySettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"archive_and_mute_new_noncontact_peers\",\"type\":\"flags.0?Bool\"}],\"type\":\"GlobalPrivacySettings\"},{\"id\":1107543535,\"predicate\":\"help.countryCode\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"country_code\",\"type\":\"string\"},{\"name\":\"prefixes\",\"type\":\"flags.0?Vector<string>\"},{\"name\":\"patterns\",\"type\":\"flags.1?Vector<string>\"}],\"type\":\"help.CountryCode\"},{\"id\":-1014526429,\"predicate\":\"help.country\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"hidden\",\"type\":\"flags.0?true\"},{\"name\":\"iso2\",\"type\":\"string\"},{\"name\":\"default_name\",\"type\":\"string\"},{\"name\":\"name\",\"type\":\"flags.1?string\"},{\"name\":\"country_codes\",\"type\":\"Vector<help.CountryCode>\"}],\"type\":\"help.Country\"},{\"id\":-1815339214,\"predicate\":\"help.countriesListNotModified\",\"params\":[],\"type\":\"help.CountriesList\"},{\"id\":-2016381538,\"predicate\":\"help.countriesList\",\"params\":[{\"name\":\"countries\",\"type\":\"Vector<help.Country>\"},{\"name\":\"hash\",\"type\":\"int\"}],\"type\":\"help.CountriesList\"},{\"id\":1163625789,\"predicate\":\"messageViews\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"views\",\"type\":\"flags.0?int\"},{\"name\":\"forwards\",\"type\":\"flags.1?int\"},{\"name\":\"replies\",\"type\":\"flags.2?MessageReplies\"}],\"type\":\"MessageViews\"},{\"id\":-1228606141,\"predicate\":\"messages.messageViews\",\"params\":[{\"name\":\"views\",\"type\":\"Vector<MessageViews>\"},{\"name\":\"chats\",\"type\":\"Vector<Chat>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"messages.MessageViews\"},{\"id\":-1506535550,\"predicate\":\"messages.discussionMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"messages\",\"type\":\"Vector<Message>\"},{\"name\":\"max_id\",\"type\":\"flags.0?int\"},{\"name\":\"read_inbox_max_id\",\"type\":\"flags.1?int\"},{\"name\":\"read_outbox_max_id\",\"type\":\"flags.2?int\"},{\"name\":\"unread_count\",\"type\":\"int\"},{\"name\":\"chats\",\"type\":\"Vector<Chat>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"messages.DiscussionMessage\"},{\"id\":-1495959709,\"predicate\":\"messageReplyHeader\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"reply_to_msg_id\",\"type\":\"int\"},{\"name\":\"reply_to_peer_id\",\"type\":\"flags.0?Peer\"},{\"name\":\"reply_to_top_id\",\"type\":\"flags.1?int\"}],\"type\":\"MessageReplyHeader\"},{\"id\":-2083123262,\"predicate\":\"messageReplies\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"comments\",\"type\":\"flags.0?true\"},{\"name\":\"replies\",\"type\":\"int\"},{\"name\":\"replies_pts\",\"type\":\"int\"},{\"name\":\"recent_repliers\",\"type\":\"flags.1?Vector<Peer>\"},{\"name\":\"channel_id\",\"type\":\"flags.0?long\"},{\"name\":\"max_id\",\"type\":\"flags.2?int\"},{\"name\":\"read_max_id\",\"type\":\"flags.3?int\"}],\"type\":\"MessageReplies\"},{\"id\":-386039788,\"predicate\":\"peerBlocked\",\"params\":[{\"name\":\"peer_id\",\"type\":\"Peer\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"PeerBlocked\"},{\"id\":-1986399595,\"predicate\":\"stats.messageStats\",\"params\":[{\"name\":\"views_graph\",\"type\":\"StatsGraph\"}],\"type\":\"stats.MessageStats\"},{\"id\":2004925620,\"predicate\":\"groupCallDiscarded\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"duration\",\"type\":\"int\"}],\"type\":\"GroupCall\"},{\"id\":-711498484,\"predicate\":\"groupCall\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"join_muted\",\"type\":\"flags.1?true\"},{\"name\":\"can_change_join_muted\",\"type\":\"flags.2?true\"},{\"name\":\"join_date_asc\",\"type\":\"flags.6?true\"},{\"name\":\"schedule_start_subscribed\",\"type\":\"flags.8?true\"},{\"name\":\"can_start_video\",\"type\":\"flags.9?true\"},{\"name\":\"record_video_active\",\"type\":\"flags.11?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"participants_count\",\"type\":\"int\"},{\"name\":\"title\",\"type\":\"flags.3?string\"},{\"name\":\"stream_dc_id\",\"type\":\"flags.4?int\"},{\"name\":\"record_start_date\",\"type\":\"flags.5?int\"},{\"name\":\"schedule_date\",\"type\":\"flags.7?int\"},{\"name\":\"unmuted_video_count\",\"type\":\"flags.10?int\"},{\"name\":\"unmuted_video_limit\",\"type\":\"int\"},{\"name\":\"version\",\"type\":\"int\"}],\"type\":\"GroupCall\"},{\"id\":-659913713,\"predicate\":\"inputGroupCall\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputGroupCall\"},{\"id\":-341428482,\"predicate\":\"groupCallParticipant\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"muted\",\"type\":\"flags.0?true\"},{\"name\":\"left\",\"type\":\"flags.1?true\"},{\"name\":\"can_self_unmute\",\"type\":\"flags.2?true\"},{\"name\":\"just_joined\",\"type\":\"flags.4?true\"},{\"name\":\"versioned\",\"type\":\"flags.5?true\"},{\"name\":\"min\",\"type\":\"flags.8?true\"},{\"name\":\"muted_by_you\",\"type\":\"flags.9?true\"},{\"name\":\"volume_by_admin\",\"type\":\"flags.10?true\"},{\"name\":\"self\",\"type\":\"flags.12?true\"},{\"name\":\"video_joined\",\"type\":\"flags.15?true\"},{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"active_date\",\"type\":\"flags.3?int\"},{\"name\":\"source\",\"type\":\"int\"},{\"name\":\"volume\",\"type\":\"flags.7?int\"},{\"name\":\"about\",\"type\":\"flags.11?string\"},{\"name\":\"raise_hand_rating\",\"type\":\"flags.13?long\"},{\"name\":\"video\",\"type\":\"flags.6?GroupCallParticipantVideo\"},{\"name\":\"presentation\",\"type\":\"flags.14?GroupCallParticipantVideo\"}],\"type\":\"GroupCallParticipant\"},{\"id\":-1636664659,\"predicate\":\"phone.groupCall\",\"params\":[{\"name\":\"call\",\"type\":\"GroupCall\"},{\"name\":\"participants\",\"type\":\"Vector<GroupCallParticipant>\"},{\"name\":\"participants_next_offset\",\"type\":\"string\"},{\"name\":\"chats\",\"type\":\"Vector<Chat>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"phone.GroupCall\"},{\"id\":-193506890,\"predicate\":\"phone.groupParticipants\",\"params\":[{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"participants\",\"type\":\"Vector<GroupCallParticipant>\"},{\"name\":\"next_offset\",\"type\":\"string\"},{\"name\":\"chats\",\"type\":\"Vector<Chat>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"},{\"name\":\"version\",\"type\":\"int\"}],\"type\":\"phone.GroupParticipants\"},{\"id\":813821341,\"predicate\":\"inlineQueryPeerTypeSameBotPM\",\"params\":[],\"type\":\"InlineQueryPeerType\"},{\"id\":-2093215828,\"predicate\":\"inlineQueryPeerTypePM\",\"params\":[],\"type\":\"InlineQueryPeerType\"},{\"id\":-681130742,\"predicate\":\"inlineQueryPeerTypeChat\",\"params\":[],\"type\":\"InlineQueryPeerType\"},{\"id\":1589952067,\"predicate\":\"inlineQueryPeerTypeMegagroup\",\"params\":[],\"type\":\"InlineQueryPeerType\"},{\"id\":1664413338,\"predicate\":\"inlineQueryPeerTypeBroadcast\",\"params\":[],\"type\":\"InlineQueryPeerType\"},{\"id\":375566091,\"predicate\":\"messages.historyImport\",\"params\":[{\"name\":\"id\",\"type\":\"long\"}],\"type\":\"messages.HistoryImport\"},{\"id\":1578088377,\"predicate\":\"messages.historyImportParsed\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"pm\",\"type\":\"flags.0?true\"},{\"name\":\"group\",\"type\":\"flags.1?true\"},{\"name\":\"title\",\"type\":\"flags.2?string\"}],\"type\":\"messages.HistoryImportParsed\"},{\"id\":-275956116,\"predicate\":\"messages.affectedFoundMessages\",\"params\":[{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"},{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"messages\",\"type\":\"Vector<int>\"}],\"type\":\"messages.AffectedFoundMessages\"},{\"id\":-1940201511,\"predicate\":\"chatInviteImporter\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"requested\",\"type\":\"flags.0?true\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"about\",\"type\":\"flags.2?string\"},{\"name\":\"approved_by\",\"type\":\"flags.1?long\"}],\"type\":\"ChatInviteImporter\"},{\"id\":-1111085620,\"predicate\":\"messages.exportedChatInvites\",\"params\":[{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"invites\",\"type\":\"Vector<ExportedChatInvite>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"messages.ExportedChatInvites\"},{\"id\":410107472,\"predicate\":\"messages.exportedChatInvite\",\"params\":[{\"name\":\"invite\",\"type\":\"ExportedChatInvite\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"messages.ExportedChatInvite\"},{\"id\":572915951,\"predicate\":\"messages.exportedChatInviteReplaced\",\"params\":[{\"name\":\"invite\",\"type\":\"ExportedChatInvite\"},{\"name\":\"new_invite\",\"type\":\"ExportedChatInvite\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"messages.ExportedChatInvite\"},{\"id\":-2118733814,\"predicate\":\"messages.chatInviteImporters\",\"params\":[{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"importers\",\"type\":\"Vector<ChatInviteImporter>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"messages.ChatInviteImporters\"},{\"id\":-219353309,\"predicate\":\"chatAdminWithInvites\",\"params\":[{\"name\":\"admin_id\",\"type\":\"long\"},{\"name\":\"invites_count\",\"type\":\"int\"},{\"name\":\"revoked_invites_count\",\"type\":\"int\"}],\"type\":\"ChatAdminWithInvites\"},{\"id\":-1231326505,\"predicate\":\"messages.chatAdminsWithInvites\",\"params\":[{\"name\":\"admins\",\"type\":\"Vector<ChatAdminWithInvites>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"messages.ChatAdminsWithInvites\"},{\"id\":-1571952873,\"predicate\":\"messages.checkedHistoryImportPeer\",\"params\":[{\"name\":\"confirm_text\",\"type\":\"string\"}],\"type\":\"messages.CheckedHistoryImportPeer\"},{\"id\":-1343921601,\"predicate\":\"phone.joinAsPeers\",\"params\":[{\"name\":\"peers\",\"type\":\"Vector<Peer>\"},{\"name\":\"chats\",\"type\":\"Vector<Chat>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"phone.JoinAsPeers\"},{\"id\":541839704,\"predicate\":\"phone.exportedGroupCallInvite\",\"params\":[{\"name\":\"link\",\"type\":\"string\"}],\"type\":\"phone.ExportedGroupCallInvite\"},{\"id\":-592373577,\"predicate\":\"groupCallParticipantVideoSourceGroup\",\"params\":[{\"name\":\"semantics\",\"type\":\"string\"},{\"name\":\"sources\",\"type\":\"Vector<int>\"}],\"type\":\"GroupCallParticipantVideoSourceGroup\"},{\"id\":1735736008,\"predicate\":\"groupCallParticipantVideo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"paused\",\"type\":\"flags.0?true\"},{\"name\":\"endpoint\",\"type\":\"string\"},{\"name\":\"source_groups\",\"type\":\"Vector<GroupCallParticipantVideoSourceGroup>\"},{\"name\":\"audio_source\",\"type\":\"flags.1?int\"}],\"type\":\"GroupCallParticipantVideo\"},{\"id\":-2046910401,\"predicate\":\"stickers.suggestedShortName\",\"params\":[{\"name\":\"short_name\",\"type\":\"string\"}],\"type\":\"stickers.SuggestedShortName\"},{\"id\":795652779,\"predicate\":\"botCommandScopeDefault\",\"params\":[],\"type\":\"BotCommandScope\"},{\"id\":1011811544,\"predicate\":\"botCommandScopeUsers\",\"params\":[],\"type\":\"BotCommandScope\"},{\"id\":1877059713,\"predicate\":\"botCommandScopeChats\",\"params\":[],\"type\":\"BotCommandScope\"},{\"id\":-1180016534,\"predicate\":\"botCommandScopeChatAdmins\",\"params\":[],\"type\":\"BotCommandScope\"},{\"id\":-610432643,\"predicate\":\"botCommandScopePeer\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"BotCommandScope\"},{\"id\":1071145937,\"predicate\":\"botCommandScopePeerAdmins\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"BotCommandScope\"},{\"id\":169026035,\"predicate\":\"botCommandScopePeerUser\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"user_id\",\"type\":\"InputUser\"}],\"type\":\"BotCommandScope\"},{\"id\":-478701471,\"predicate\":\"account.resetPasswordFailedWait\",\"params\":[{\"name\":\"retry_date\",\"type\":\"int\"}],\"type\":\"account.ResetPasswordResult\"},{\"id\":-370148227,\"predicate\":\"account.resetPasswordRequestedWait\",\"params\":[{\"name\":\"until_date\",\"type\":\"int\"}],\"type\":\"account.ResetPasswordResult\"},{\"id\":-383330754,\"predicate\":\"account.resetPasswordOk\",\"params\":[],\"type\":\"account.ResetPasswordResult\"},{\"id\":981691896,\"predicate\":\"sponsoredMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"random_id\",\"type\":\"bytes\"},{\"name\":\"from_id\",\"type\":\"flags.3?Peer\"},{\"name\":\"chat_invite\",\"type\":\"flags.4?ChatInvite\"},{\"name\":\"chat_invite_hash\",\"type\":\"flags.4?string\"},{\"name\":\"channel_post\",\"type\":\"flags.2?int\"},{\"name\":\"start_param\",\"type\":\"flags.0?string\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"flags.1?Vector<MessageEntity>\"}],\"type\":\"SponsoredMessage\"},{\"id\":1705297877,\"predicate\":\"messages.sponsoredMessages\",\"params\":[{\"name\":\"messages\",\"type\":\"Vector<SponsoredMessage>\"},{\"name\":\"chats\",\"type\":\"Vector<Chat>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"messages.SponsoredMessages\"},{\"id\":-911191137,\"predicate\":\"searchResultsCalendarPeriod\",\"params\":[{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"min_msg_id\",\"type\":\"int\"},{\"name\":\"max_msg_id\",\"type\":\"int\"},{\"name\":\"count\",\"type\":\"int\"}],\"type\":\"SearchResultsCalendarPeriod\"},{\"id\":343859772,\"predicate\":\"messages.searchResultsCalendar\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"inexact\",\"type\":\"flags.0?true\"},{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"min_date\",\"type\":\"int\"},{\"name\":\"min_msg_id\",\"type\":\"int\"},{\"name\":\"offset_id_offset\",\"type\":\"flags.1?int\"},{\"name\":\"periods\",\"type\":\"Vector<SearchResultsCalendarPeriod>\"},{\"name\":\"messages\",\"type\":\"Vector<Message>\"},{\"name\":\"chats\",\"type\":\"Vector<Chat>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"messages.SearchResultsCalendar\"},{\"id\":2137295719,\"predicate\":\"searchResultPosition\",\"params\":[{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"offset\",\"type\":\"int\"}],\"type\":\"SearchResultsPosition\"},{\"id\":1404185519,\"predicate\":\"messages.searchResultsPositions\",\"params\":[{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"positions\",\"type\":\"Vector<SearchResultsPosition>\"}],\"type\":\"messages.SearchResultsPositions\"},{\"id\":-2091463255,\"predicate\":\"channels.sendAsPeers\",\"params\":[{\"name\":\"peers\",\"type\":\"Vector<Peer>\"},{\"name\":\"chats\",\"type\":\"Vector<Chat>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"channels.SendAsPeers\"},{\"id\":997004590,\"predicate\":\"users.userFull\",\"params\":[{\"name\":\"full_user\",\"type\":\"UserFull\"},{\"name\":\"chats\",\"type\":\"Vector<Chat>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"users.UserFull\"},{\"id\":1753266509,\"predicate\":\"messages.peerSettings\",\"params\":[{\"name\":\"settings\",\"type\":\"PeerSettings\"},{\"name\":\"chats\",\"type\":\"Vector<Chat>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"messages.PeerSettings\"},{\"id\":-1012759713,\"predicate\":\"auth.loggedOut\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"future_auth_token\",\"type\":\"flags.0?bytes\"}],\"type\":\"auth.LoggedOut\"},{\"id\":1873957073,\"predicate\":\"reactionCount\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"chosen\",\"type\":\"flags.0?true\"},{\"name\":\"reaction\",\"type\":\"string\"},{\"name\":\"count\",\"type\":\"int\"}],\"type\":\"ReactionCount\"},{\"id\":142306870,\"predicate\":\"messageReactions\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"min\",\"type\":\"flags.0?true\"},{\"name\":\"can_see_list\",\"type\":\"flags.2?true\"},{\"name\":\"results\",\"type\":\"Vector<ReactionCount>\"},{\"name\":\"recent_reactons\",\"type\":\"flags.1?Vector<MessageUserReaction>\"}],\"type\":\"MessageReactions\"},{\"id\":-1826077446,\"predicate\":\"messageUserReaction\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"reaction\",\"type\":\"string\"}],\"type\":\"MessageUserReaction\"},{\"id\":-1553558980,\"predicate\":\"messages.messageReactionsList\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"reactions\",\"type\":\"Vector<MessageUserReaction>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"},{\"name\":\"next_offset\",\"type\":\"flags.0?string\"}],\"type\":\"messages.MessageReactionsList\"},{\"id\":-1065882623,\"predicate\":\"availableReaction\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"inactive\",\"type\":\"flags.0?true\"},{\"name\":\"reaction\",\"type\":\"string\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"static_icon\",\"type\":\"Document\"},{\"name\":\"appear_animation\",\"type\":\"Document\"},{\"name\":\"select_animation\",\"type\":\"Document\"},{\"name\":\"activate_animation\",\"type\":\"Document\"},{\"name\":\"effect_animation\",\"type\":\"Document\"},{\"name\":\"around_animation\",\"type\":\"flags.1?Document\"},{\"name\":\"center_icon\",\"type\":\"flags.1?Document\"}],\"type\":\"AvailableReaction\"},{\"id\":-1626924713,\"predicate\":\"messages.availableReactionsNotModified\",\"params\":[],\"type\":\"messages.AvailableReactions\"},{\"id\":1989032621,\"predicate\":\"messages.availableReactions\",\"params\":[{\"name\":\"hash\",\"type\":\"int\"},{\"name\":\"reactions\",\"type\":\"Vector<AvailableReaction>\"}],\"type\":\"messages.AvailableReactions\"}],\"methods\":[{\"id\":-878758099,\"method\":\"invokeAfterMsg\",\"params\":[{\"name\":\"msg_id\",\"type\":\"long\"},{\"name\":\"query\",\"type\":\"!X\"}],\"type\":\"X\"},{\"id\":1036301552,\"method\":\"invokeAfterMsgs\",\"params\":[{\"name\":\"msg_ids\",\"type\":\"Vector<long>\"},{\"name\":\"query\",\"type\":\"!X\"}],\"type\":\"X\"},{\"id\":-1043505495,\"method\":\"initConnection\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"api_id\",\"type\":\"int\"},{\"name\":\"device_model\",\"type\":\"string\"},{\"name\":\"system_version\",\"type\":\"string\"},{\"name\":\"app_version\",\"type\":\"string\"},{\"name\":\"system_lang_code\",\"type\":\"string\"},{\"name\":\"lang_pack\",\"type\":\"string\"},{\"name\":\"lang_code\",\"type\":\"string\"},{\"name\":\"proxy\",\"type\":\"flags.0?InputClientProxy\"},{\"name\":\"params\",\"type\":\"flags.1?JSONValue\"},{\"name\":\"query\",\"type\":\"!X\"}],\"type\":\"X\"},{\"id\":-627372787,\"method\":\"invokeWithLayer\",\"params\":[{\"name\":\"layer\",\"type\":\"int\"},{\"name\":\"query\",\"type\":\"!X\"}],\"type\":\"X\"},{\"id\":-1080796745,\"method\":\"invokeWithoutUpdates\",\"params\":[{\"name\":\"query\",\"type\":\"!X\"}],\"type\":\"X\"},{\"id\":911373810,\"method\":\"invokeWithMessagesRange\",\"params\":[{\"name\":\"range\",\"type\":\"MessageRange\"},{\"name\":\"query\",\"type\":\"!X\"}],\"type\":\"X\"},{\"id\":-1398145746,\"method\":\"invokeWithTakeout\",\"params\":[{\"name\":\"takeout_id\",\"type\":\"long\"},{\"name\":\"query\",\"type\":\"!X\"}],\"type\":\"X\"},{\"id\":-1502141361,\"method\":\"auth.sendCode\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"api_id\",\"type\":\"int\"},{\"name\":\"api_hash\",\"type\":\"string\"},{\"name\":\"settings\",\"type\":\"CodeSettings\"}],\"type\":\"auth.SentCode\"},{\"id\":-2131827673,\"method\":\"auth.signUp\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"phone_code_hash\",\"type\":\"string\"},{\"name\":\"first_name\",\"type\":\"string\"},{\"name\":\"last_name\",\"type\":\"string\"}],\"type\":\"auth.Authorization\"},{\"id\":-1126886015,\"method\":\"auth.signIn\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"phone_code_hash\",\"type\":\"string\"},{\"name\":\"phone_code\",\"type\":\"string\"}],\"type\":\"auth.Authorization\"},{\"id\":1047706137,\"method\":\"auth.logOut\",\"params\":[],\"type\":\"auth.LoggedOut\"},{\"id\":-1616179942,\"method\":\"auth.resetAuthorizations\",\"params\":[],\"type\":\"Bool\"},{\"id\":-440401971,\"method\":\"auth.exportAuthorization\",\"params\":[{\"name\":\"dc_id\",\"type\":\"int\"}],\"type\":\"auth.ExportedAuthorization\"},{\"id\":-1518699091,\"method\":\"auth.importAuthorization\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"auth.Authorization\"},{\"id\":-841733627,\"method\":\"auth.bindTempAuthKey\",\"params\":[{\"name\":\"perm_auth_key_id\",\"type\":\"long\"},{\"name\":\"nonce\",\"type\":\"long\"},{\"name\":\"expires_at\",\"type\":\"int\"},{\"name\":\"encrypted_message\",\"type\":\"bytes\"}],\"type\":\"Bool\"},{\"id\":1738800940,\"method\":\"auth.importBotAuthorization\",\"params\":[{\"name\":\"flags\",\"type\":\"int\"},{\"name\":\"api_id\",\"type\":\"int\"},{\"name\":\"api_hash\",\"type\":\"string\"},{\"name\":\"bot_auth_token\",\"type\":\"string\"}],\"type\":\"auth.Authorization\"},{\"id\":-779399914,\"method\":\"auth.checkPassword\",\"params\":[{\"name\":\"password\",\"type\":\"InputCheckPasswordSRP\"}],\"type\":\"auth.Authorization\"},{\"id\":-661144474,\"method\":\"auth.requestPasswordRecovery\",\"params\":[],\"type\":\"auth.PasswordRecovery\"},{\"id\":923364464,\"method\":\"auth.recoverPassword\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"code\",\"type\":\"string\"},{\"name\":\"new_settings\",\"type\":\"flags.0?account.PasswordInputSettings\"}],\"type\":\"auth.Authorization\"},{\"id\":1056025023,\"method\":\"auth.resendCode\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"phone_code_hash\",\"type\":\"string\"}],\"type\":\"auth.SentCode\"},{\"id\":520357240,\"method\":\"auth.cancelCode\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"phone_code_hash\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":-1907842680,\"method\":\"auth.dropTempAuthKeys\",\"params\":[{\"name\":\"except_auth_keys\",\"type\":\"Vector<long>\"}],\"type\":\"Bool\"},{\"id\":-1210022402,\"method\":\"auth.exportLoginToken\",\"params\":[{\"name\":\"api_id\",\"type\":\"int\"},{\"name\":\"api_hash\",\"type\":\"string\"},{\"name\":\"except_ids\",\"type\":\"Vector<long>\"}],\"type\":\"auth.LoginToken\"},{\"id\":-1783866140,\"method\":\"auth.importLoginToken\",\"params\":[{\"name\":\"token\",\"type\":\"bytes\"}],\"type\":\"auth.LoginToken\"},{\"id\":-392909491,\"method\":\"auth.acceptLoginToken\",\"params\":[{\"name\":\"token\",\"type\":\"bytes\"}],\"type\":\"Authorization\"},{\"id\":221691769,\"method\":\"auth.checkRecoveryPassword\",\"params\":[{\"name\":\"code\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":-326762118,\"method\":\"account.registerDevice\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"no_muted\",\"type\":\"flags.0?true\"},{\"name\":\"token_type\",\"type\":\"int\"},{\"name\":\"token\",\"type\":\"string\"},{\"name\":\"app_sandbox\",\"type\":\"Bool\"},{\"name\":\"secret\",\"type\":\"bytes\"},{\"name\":\"other_uids\",\"type\":\"Vector<long>\"}],\"type\":\"Bool\"},{\"id\":1779249670,\"method\":\"account.unregisterDevice\",\"params\":[{\"name\":\"token_type\",\"type\":\"int\"},{\"name\":\"token\",\"type\":\"string\"},{\"name\":\"other_uids\",\"type\":\"Vector<long>\"}],\"type\":\"Bool\"},{\"id\":-2067899501,\"method\":\"account.updateNotifySettings\",\"params\":[{\"name\":\"peer\",\"type\":\"InputNotifyPeer\"},{\"name\":\"settings\",\"type\":\"InputPeerNotifySettings\"}],\"type\":\"Bool\"},{\"id\":313765169,\"method\":\"account.getNotifySettings\",\"params\":[{\"name\":\"peer\",\"type\":\"InputNotifyPeer\"}],\"type\":\"PeerNotifySettings\"},{\"id\":-612493497,\"method\":\"account.resetNotifySettings\",\"params\":[],\"type\":\"Bool\"},{\"id\":2018596725,\"method\":\"account.updateProfile\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"first_name\",\"type\":\"flags.0?string\"},{\"name\":\"last_name\",\"type\":\"flags.1?string\"},{\"name\":\"about\",\"type\":\"flags.2?string\"}],\"type\":\"User\"},{\"id\":1713919532,\"method\":\"account.updateStatus\",\"params\":[{\"name\":\"offline\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":127302966,\"method\":\"account.getWallPapers\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"account.WallPapers\"},{\"id\":-977650298,\"method\":\"account.reportPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"reason\",\"type\":\"ReportReason\"},{\"name\":\"message\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":655677548,\"method\":\"account.checkUsername\",\"params\":[{\"name\":\"username\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":1040964988,\"method\":\"account.updateUsername\",\"params\":[{\"name\":\"username\",\"type\":\"string\"}],\"type\":\"User\"},{\"id\":-623130288,\"method\":\"account.getPrivacy\",\"params\":[{\"name\":\"key\",\"type\":\"InputPrivacyKey\"}],\"type\":\"account.PrivacyRules\"},{\"id\":-906486552,\"method\":\"account.setPrivacy\",\"params\":[{\"name\":\"key\",\"type\":\"InputPrivacyKey\"},{\"name\":\"rules\",\"type\":\"Vector<InputPrivacyRule>\"}],\"type\":\"account.PrivacyRules\"},{\"id\":1099779595,\"method\":\"account.deleteAccount\",\"params\":[{\"name\":\"reason\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":150761757,\"method\":\"account.getAccountTTL\",\"params\":[],\"type\":\"AccountDaysTTL\"},{\"id\":608323678,\"method\":\"account.setAccountTTL\",\"params\":[{\"name\":\"ttl\",\"type\":\"AccountDaysTTL\"}],\"type\":\"Bool\"},{\"id\":-2108208411,\"method\":\"account.sendChangePhoneCode\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"settings\",\"type\":\"CodeSettings\"}],\"type\":\"auth.SentCode\"},{\"id\":1891839707,\"method\":\"account.changePhone\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"phone_code_hash\",\"type\":\"string\"},{\"name\":\"phone_code\",\"type\":\"string\"}],\"type\":\"User\"},{\"id\":954152242,\"method\":\"account.updateDeviceLocked\",\"params\":[{\"name\":\"period\",\"type\":\"int\"}],\"type\":\"Bool\"},{\"id\":-484392616,\"method\":\"account.getAuthorizations\",\"params\":[],\"type\":\"account.Authorizations\"},{\"id\":-545786948,\"method\":\"account.resetAuthorization\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"Bool\"},{\"id\":1418342645,\"method\":\"account.getPassword\",\"params\":[],\"type\":\"account.Password\"},{\"id\":-1663767815,\"method\":\"account.getPasswordSettings\",\"params\":[{\"name\":\"password\",\"type\":\"InputCheckPasswordSRP\"}],\"type\":\"account.PasswordSettings\"},{\"id\":-1516564433,\"method\":\"account.updatePasswordSettings\",\"params\":[{\"name\":\"password\",\"type\":\"InputCheckPasswordSRP\"},{\"name\":\"new_settings\",\"type\":\"account.PasswordInputSettings\"}],\"type\":\"Bool\"},{\"id\":457157256,\"method\":\"account.sendConfirmPhoneCode\",\"params\":[{\"name\":\"hash\",\"type\":\"string\"},{\"name\":\"settings\",\"type\":\"CodeSettings\"}],\"type\":\"auth.SentCode\"},{\"id\":1596029123,\"method\":\"account.confirmPhone\",\"params\":[{\"name\":\"phone_code_hash\",\"type\":\"string\"},{\"name\":\"phone_code\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":1151208273,\"method\":\"account.getTmpPassword\",\"params\":[{\"name\":\"password\",\"type\":\"InputCheckPasswordSRP\"},{\"name\":\"period\",\"type\":\"int\"}],\"type\":\"account.TmpPassword\"},{\"id\":405695855,\"method\":\"account.getWebAuthorizations\",\"params\":[],\"type\":\"account.WebAuthorizations\"},{\"id\":755087855,\"method\":\"account.resetWebAuthorization\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"Bool\"},{\"id\":1747789204,\"method\":\"account.resetWebAuthorizations\",\"params\":[],\"type\":\"Bool\"},{\"id\":-1299661699,\"method\":\"account.getAllSecureValues\",\"params\":[],\"type\":\"Vector<SecureValue>\"},{\"id\":1936088002,\"method\":\"account.getSecureValue\",\"params\":[{\"name\":\"types\",\"type\":\"Vector<SecureValueType>\"}],\"type\":\"Vector<SecureValue>\"},{\"id\":-1986010339,\"method\":\"account.saveSecureValue\",\"params\":[{\"name\":\"value\",\"type\":\"InputSecureValue\"},{\"name\":\"secure_secret_id\",\"type\":\"long\"}],\"type\":\"SecureValue\"},{\"id\":-1199522741,\"method\":\"account.deleteSecureValue\",\"params\":[{\"name\":\"types\",\"type\":\"Vector<SecureValueType>\"}],\"type\":\"Bool\"},{\"id\":-1456907910,\"method\":\"account.getAuthorizationForm\",\"params\":[{\"name\":\"bot_id\",\"type\":\"long\"},{\"name\":\"scope\",\"type\":\"string\"},{\"name\":\"public_key\",\"type\":\"string\"}],\"type\":\"account.AuthorizationForm\"},{\"id\":-202552205,\"method\":\"account.acceptAuthorization\",\"params\":[{\"name\":\"bot_id\",\"type\":\"long\"},{\"name\":\"scope\",\"type\":\"string\"},{\"name\":\"public_key\",\"type\":\"string\"},{\"name\":\"value_hashes\",\"type\":\"Vector<SecureValueHash>\"},{\"name\":\"credentials\",\"type\":\"SecureCredentialsEncrypted\"}],\"type\":\"Bool\"},{\"id\":-1516022023,\"method\":\"account.sendVerifyPhoneCode\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"settings\",\"type\":\"CodeSettings\"}],\"type\":\"auth.SentCode\"},{\"id\":1305716726,\"method\":\"account.verifyPhone\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"phone_code_hash\",\"type\":\"string\"},{\"name\":\"phone_code\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":1880182943,\"method\":\"account.sendVerifyEmailCode\",\"params\":[{\"name\":\"email\",\"type\":\"string\"}],\"type\":\"account.SentEmailCode\"},{\"id\":-323339813,\"method\":\"account.verifyEmail\",\"params\":[{\"name\":\"email\",\"type\":\"string\"},{\"name\":\"code\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":-262453244,\"method\":\"account.initTakeoutSession\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"contacts\",\"type\":\"flags.0?true\"},{\"name\":\"message_users\",\"type\":\"flags.1?true\"},{\"name\":\"message_chats\",\"type\":\"flags.2?true\"},{\"name\":\"message_megagroups\",\"type\":\"flags.3?true\"},{\"name\":\"message_channels\",\"type\":\"flags.4?true\"},{\"name\":\"files\",\"type\":\"flags.5?true\"},{\"name\":\"file_max_size\",\"type\":\"flags.5?int\"}],\"type\":\"account.Takeout\"},{\"id\":489050862,\"method\":\"account.finishTakeoutSession\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"success\",\"type\":\"flags.0?true\"}],\"type\":\"Bool\"},{\"id\":-1881204448,\"method\":\"account.confirmPasswordEmail\",\"params\":[{\"name\":\"code\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":2055154197,\"method\":\"account.resendPasswordEmail\",\"params\":[],\"type\":\"Bool\"},{\"id\":-1043606090,\"method\":\"account.cancelPasswordEmail\",\"params\":[],\"type\":\"Bool\"},{\"id\":-1626880216,\"method\":\"account.getContactSignUpNotification\",\"params\":[],\"type\":\"Bool\"},{\"id\":-806076575,\"method\":\"account.setContactSignUpNotification\",\"params\":[{\"name\":\"silent\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":1398240377,\"method\":\"account.getNotifyExceptions\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"compare_sound\",\"type\":\"flags.1?true\"},{\"name\":\"peer\",\"type\":\"flags.0?InputNotifyPeer\"}],\"type\":\"Updates\"},{\"id\":-57811990,\"method\":\"account.getWallPaper\",\"params\":[{\"name\":\"wallpaper\",\"type\":\"InputWallPaper\"}],\"type\":\"WallPaper\"},{\"id\":-578472351,\"method\":\"account.uploadWallPaper\",\"params\":[{\"name\":\"file\",\"type\":\"InputFile\"},{\"name\":\"mime_type\",\"type\":\"string\"},{\"name\":\"settings\",\"type\":\"WallPaperSettings\"}],\"type\":\"WallPaper\"},{\"id\":1817860919,\"method\":\"account.saveWallPaper\",\"params\":[{\"name\":\"wallpaper\",\"type\":\"InputWallPaper\"},{\"name\":\"unsave\",\"type\":\"Bool\"},{\"name\":\"settings\",\"type\":\"WallPaperSettings\"}],\"type\":\"Bool\"},{\"id\":-18000023,\"method\":\"account.installWallPaper\",\"params\":[{\"name\":\"wallpaper\",\"type\":\"InputWallPaper\"},{\"name\":\"settings\",\"type\":\"WallPaperSettings\"}],\"type\":\"Bool\"},{\"id\":-1153722364,\"method\":\"account.resetWallPapers\",\"params\":[],\"type\":\"Bool\"},{\"id\":1457130303,\"method\":\"account.getAutoDownloadSettings\",\"params\":[],\"type\":\"account.AutoDownloadSettings\"},{\"id\":1995661875,\"method\":\"account.saveAutoDownloadSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"low\",\"type\":\"flags.0?true\"},{\"name\":\"high\",\"type\":\"flags.1?true\"},{\"name\":\"settings\",\"type\":\"AutoDownloadSettings\"}],\"type\":\"Bool\"},{\"id\":473805619,\"method\":\"account.uploadTheme\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"file\",\"type\":\"InputFile\"},{\"name\":\"thumb\",\"type\":\"flags.0?InputFile\"},{\"name\":\"file_name\",\"type\":\"string\"},{\"name\":\"mime_type\",\"type\":\"string\"}],\"type\":\"Document\"},{\"id\":1697530880,\"method\":\"account.createTheme\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"slug\",\"type\":\"string\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"document\",\"type\":\"flags.2?InputDocument\"},{\"name\":\"settings\",\"type\":\"flags.3?Vector<InputThemeSettings>\"}],\"type\":\"Theme\"},{\"id\":737414348,\"method\":\"account.updateTheme\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"format\",\"type\":\"string\"},{\"name\":\"theme\",\"type\":\"InputTheme\"},{\"name\":\"slug\",\"type\":\"flags.0?string\"},{\"name\":\"title\",\"type\":\"flags.1?string\"},{\"name\":\"document\",\"type\":\"flags.2?InputDocument\"},{\"name\":\"settings\",\"type\":\"flags.3?Vector<InputThemeSettings>\"}],\"type\":\"Theme\"},{\"id\":-229175188,\"method\":\"account.saveTheme\",\"params\":[{\"name\":\"theme\",\"type\":\"InputTheme\"},{\"name\":\"unsave\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":-953697477,\"method\":\"account.installTheme\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"dark\",\"type\":\"flags.0?true\"},{\"name\":\"theme\",\"type\":\"flags.1?InputTheme\"},{\"name\":\"format\",\"type\":\"flags.2?string\"},{\"name\":\"base_theme\",\"type\":\"flags.3?BaseTheme\"}],\"type\":\"Bool\"},{\"id\":-1919060949,\"method\":\"account.getTheme\",\"params\":[{\"name\":\"format\",\"type\":\"string\"},{\"name\":\"theme\",\"type\":\"InputTheme\"},{\"name\":\"document_id\",\"type\":\"long\"}],\"type\":\"Theme\"},{\"id\":1913054296,\"method\":\"account.getThemes\",\"params\":[{\"name\":\"format\",\"type\":\"string\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"account.Themes\"},{\"id\":-1250643605,\"method\":\"account.setContentSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"sensitive_enabled\",\"type\":\"flags.0?true\"}],\"type\":\"Bool\"},{\"id\":-1952756306,\"method\":\"account.getContentSettings\",\"params\":[],\"type\":\"account.ContentSettings\"},{\"id\":1705865692,\"method\":\"account.getMultiWallPapers\",\"params\":[{\"name\":\"wallpapers\",\"type\":\"Vector<InputWallPaper>\"}],\"type\":\"Vector<WallPaper>\"},{\"id\":-349483786,\"method\":\"account.getGlobalPrivacySettings\",\"params\":[],\"type\":\"GlobalPrivacySettings\"},{\"id\":517647042,\"method\":\"account.setGlobalPrivacySettings\",\"params\":[{\"name\":\"settings\",\"type\":\"GlobalPrivacySettings\"}],\"type\":\"GlobalPrivacySettings\"},{\"id\":-91437323,\"method\":\"account.reportProfilePhoto\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"photo_id\",\"type\":\"InputPhoto\"},{\"name\":\"reason\",\"type\":\"ReportReason\"},{\"name\":\"message\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":-1828139493,\"method\":\"account.resetPassword\",\"params\":[],\"type\":\"account.ResetPasswordResult\"},{\"id\":1284770294,\"method\":\"account.declinePasswordReset\",\"params\":[],\"type\":\"Bool\"},{\"id\":-700916087,\"method\":\"account.getChatThemes\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"account.Themes\"},{\"id\":-1081501024,\"method\":\"account.setAuthorizationTTL\",\"params\":[{\"name\":\"authorization_ttl_days\",\"type\":\"int\"}],\"type\":\"Bool\"},{\"id\":1089766498,\"method\":\"account.changeAuthorizationSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"encrypted_requests_disabled\",\"type\":\"flags.0?Bool\"},{\"name\":\"call_requests_disabled\",\"type\":\"flags.1?Bool\"}],\"type\":\"Bool\"},{\"id\":227648840,\"method\":\"users.getUsers\",\"params\":[{\"name\":\"id\",\"type\":\"Vector<InputUser>\"}],\"type\":\"Vector<User>\"},{\"id\":-1240508136,\"method\":\"users.getFullUser\",\"params\":[{\"name\":\"id\",\"type\":\"InputUser\"}],\"type\":\"users.UserFull\"},{\"id\":-1865902923,\"method\":\"users.setSecureValueErrors\",\"params\":[{\"name\":\"id\",\"type\":\"InputUser\"},{\"name\":\"errors\",\"type\":\"Vector<SecureValueError>\"}],\"type\":\"Bool\"},{\"id\":2061264541,\"method\":\"contacts.getContactIDs\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"Vector<int>\"},{\"id\":-995929106,\"method\":\"contacts.getStatuses\",\"params\":[],\"type\":\"Vector<ContactStatus>\"},{\"id\":1574346258,\"method\":\"contacts.getContacts\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"contacts.Contacts\"},{\"id\":746589157,\"method\":\"contacts.importContacts\",\"params\":[{\"name\":\"contacts\",\"type\":\"Vector<InputContact>\"}],\"type\":\"contacts.ImportedContacts\"},{\"id\":157945344,\"method\":\"contacts.deleteContacts\",\"params\":[{\"name\":\"id\",\"type\":\"Vector<InputUser>\"}],\"type\":\"Updates\"},{\"id\":269745566,\"method\":\"contacts.deleteByPhones\",\"params\":[{\"name\":\"phones\",\"type\":\"Vector<string>\"}],\"type\":\"Bool\"},{\"id\":1758204945,\"method\":\"contacts.block\",\"params\":[{\"name\":\"id\",\"type\":\"InputPeer\"}],\"type\":\"Bool\"},{\"id\":-1096393392,\"method\":\"contacts.unblock\",\"params\":[{\"name\":\"id\",\"type\":\"InputPeer\"}],\"type\":\"Bool\"},{\"id\":-176409329,\"method\":\"contacts.getBlocked\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"contacts.Blocked\"},{\"id\":301470424,\"method\":\"contacts.search\",\"params\":[{\"name\":\"q\",\"type\":\"string\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"contacts.Found\"},{\"id\":-113456221,\"method\":\"contacts.resolveUsername\",\"params\":[{\"name\":\"username\",\"type\":\"string\"}],\"type\":\"contacts.ResolvedPeer\"},{\"id\":-1758168906,\"method\":\"contacts.getTopPeers\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"correspondents\",\"type\":\"flags.0?true\"},{\"name\":\"bots_pm\",\"type\":\"flags.1?true\"},{\"name\":\"bots_inline\",\"type\":\"flags.2?true\"},{\"name\":\"phone_calls\",\"type\":\"flags.3?true\"},{\"name\":\"forward_users\",\"type\":\"flags.4?true\"},{\"name\":\"forward_chats\",\"type\":\"flags.5?true\"},{\"name\":\"groups\",\"type\":\"flags.10?true\"},{\"name\":\"channels\",\"type\":\"flags.15?true\"},{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"contacts.TopPeers\"},{\"id\":451113900,\"method\":\"contacts.resetTopPeerRating\",\"params\":[{\"name\":\"category\",\"type\":\"TopPeerCategory\"},{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"Bool\"},{\"id\":-2020263951,\"method\":\"contacts.resetSaved\",\"params\":[],\"type\":\"Bool\"},{\"id\":-2098076769,\"method\":\"contacts.getSaved\",\"params\":[],\"type\":\"Vector<SavedContact>\"},{\"id\":-2062238246,\"method\":\"contacts.toggleTopPeers\",\"params\":[{\"name\":\"enabled\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":-386636848,\"method\":\"contacts.addContact\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"add_phone_privacy_exception\",\"type\":\"flags.0?true\"},{\"name\":\"id\",\"type\":\"InputUser\"},{\"name\":\"first_name\",\"type\":\"string\"},{\"name\":\"last_name\",\"type\":\"string\"},{\"name\":\"phone\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":-130964977,\"method\":\"contacts.acceptContact\",\"params\":[{\"name\":\"id\",\"type\":\"InputUser\"}],\"type\":\"Updates\"},{\"id\":-750207932,\"method\":\"contacts.getLocated\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"background\",\"type\":\"flags.1?true\"},{\"name\":\"geo_point\",\"type\":\"InputGeoPoint\"},{\"name\":\"self_expires\",\"type\":\"flags.0?int\"}],\"type\":\"Updates\"},{\"id\":698914348,\"method\":\"contacts.blockFromReplies\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"delete_message\",\"type\":\"flags.0?true\"},{\"name\":\"delete_history\",\"type\":\"flags.1?true\"},{\"name\":\"report_spam\",\"type\":\"flags.2?true\"},{\"name\":\"msg_id\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":1673946374,\"method\":\"messages.getMessages\",\"params\":[{\"name\":\"id\",\"type\":\"Vector<InputMessage>\"}],\"type\":\"messages.Messages\"},{\"id\":-1594569905,\"method\":\"messages.getDialogs\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"exclude_pinned\",\"type\":\"flags.0?true\"},{\"name\":\"folder_id\",\"type\":\"flags.1?int\"},{\"name\":\"offset_date\",\"type\":\"int\"},{\"name\":\"offset_id\",\"type\":\"int\"},{\"name\":\"offset_peer\",\"type\":\"InputPeer\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.Dialogs\"},{\"id\":1143203525,\"method\":\"messages.getHistory\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"offset_id\",\"type\":\"int\"},{\"name\":\"offset_date\",\"type\":\"int\"},{\"name\":\"add_offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"max_id\",\"type\":\"int\"},{\"name\":\"min_id\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.Messages\"},{\"id\":-1593989278,\"method\":\"messages.search\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"q\",\"type\":\"string\"},{\"name\":\"from_id\",\"type\":\"flags.0?InputPeer\"},{\"name\":\"top_msg_id\",\"type\":\"flags.1?int\"},{\"name\":\"filter\",\"type\":\"MessagesFilter\"},{\"name\":\"min_date\",\"type\":\"int\"},{\"name\":\"max_date\",\"type\":\"int\"},{\"name\":\"offset_id\",\"type\":\"int\"},{\"name\":\"add_offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"max_id\",\"type\":\"int\"},{\"name\":\"min_id\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.Messages\"},{\"id\":238054714,\"method\":\"messages.readHistory\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"max_id\",\"type\":\"int\"}],\"type\":\"messages.AffectedMessages\"},{\"id\":-1332768214,\"method\":\"messages.deleteHistory\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"just_clear\",\"type\":\"flags.0?true\"},{\"name\":\"revoke\",\"type\":\"flags.1?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"max_id\",\"type\":\"int\"},{\"name\":\"min_date\",\"type\":\"flags.2?int\"},{\"name\":\"max_date\",\"type\":\"flags.3?int\"}],\"type\":\"messages.AffectedHistory\"},{\"id\":-443640366,\"method\":\"messages.deleteMessages\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"revoke\",\"type\":\"flags.0?true\"},{\"name\":\"id\",\"type\":\"Vector<int>\"}],\"type\":\"messages.AffectedMessages\"},{\"id\":94983360,\"method\":\"messages.receivedMessages\",\"params\":[{\"name\":\"max_id\",\"type\":\"int\"}],\"type\":\"Vector<ReceivedNotifyMessage>\"},{\"id\":1486110434,\"method\":\"messages.setTyping\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"top_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"action\",\"type\":\"SendMessageAction\"}],\"type\":\"Bool\"},{\"id\":228423076,\"method\":\"messages.sendMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"no_webpage\",\"type\":\"flags.1?true\"},{\"name\":\"silent\",\"type\":\"flags.5?true\"},{\"name\":\"background\",\"type\":\"flags.6?true\"},{\"name\":\"clear_draft\",\"type\":\"flags.7?true\"},{\"name\":\"noforwards\",\"type\":\"flags.14?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"reply_to_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"},{\"name\":\"entities\",\"type\":\"flags.3?Vector<MessageEntity>\"},{\"name\":\"schedule_date\",\"type\":\"flags.10?int\"},{\"name\":\"send_as\",\"type\":\"flags.13?InputPeer\"}],\"type\":\"Updates\"},{\"id\":-497026848,\"method\":\"messages.sendMedia\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"silent\",\"type\":\"flags.5?true\"},{\"name\":\"background\",\"type\":\"flags.6?true\"},{\"name\":\"clear_draft\",\"type\":\"flags.7?true\"},{\"name\":\"noforwards\",\"type\":\"flags.14?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"reply_to_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"media\",\"type\":\"InputMedia\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"},{\"name\":\"entities\",\"type\":\"flags.3?Vector<MessageEntity>\"},{\"name\":\"schedule_date\",\"type\":\"flags.10?int\"},{\"name\":\"send_as\",\"type\":\"flags.13?InputPeer\"}],\"type\":\"Updates\"},{\"id\":-869258997,\"method\":\"messages.forwardMessages\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"silent\",\"type\":\"flags.5?true\"},{\"name\":\"background\",\"type\":\"flags.6?true\"},{\"name\":\"with_my_score\",\"type\":\"flags.8?true\"},{\"name\":\"drop_author\",\"type\":\"flags.11?true\"},{\"name\":\"drop_media_captions\",\"type\":\"flags.12?true\"},{\"name\":\"noforwards\",\"type\":\"flags.14?true\"},{\"name\":\"from_peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"Vector<int>\"},{\"name\":\"random_id\",\"type\":\"Vector<long>\"},{\"name\":\"to_peer\",\"type\":\"InputPeer\"},{\"name\":\"schedule_date\",\"type\":\"flags.10?int\"},{\"name\":\"send_as\",\"type\":\"flags.13?InputPeer\"}],\"type\":\"Updates\"},{\"id\":-820669733,\"method\":\"messages.reportSpam\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"Bool\"},{\"id\":-270948702,\"method\":\"messages.getPeerSettings\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"messages.PeerSettings\"},{\"id\":-1991005362,\"method\":\"messages.report\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"Vector<int>\"},{\"name\":\"reason\",\"type\":\"ReportReason\"},{\"name\":\"message\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":1240027791,\"method\":\"messages.getChats\",\"params\":[{\"name\":\"id\",\"type\":\"Vector<long>\"}],\"type\":\"messages.Chats\"},{\"id\":-1364194508,\"method\":\"messages.getFullChat\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"}],\"type\":\"messages.ChatFull\"},{\"id\":1937260541,\"method\":\"messages.editChatTitle\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"title\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":903730804,\"method\":\"messages.editChatPhoto\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"photo\",\"type\":\"InputChatPhoto\"}],\"type\":\"Updates\"},{\"id\":-230206493,\"method\":\"messages.addChatUser\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"fwd_limit\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":-1575461717,\"method\":\"messages.deleteChatUser\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"revoke_history\",\"type\":\"flags.0?true\"},{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"InputUser\"}],\"type\":\"Updates\"},{\"id\":164303470,\"method\":\"messages.createChat\",\"params\":[{\"name\":\"users\",\"type\":\"Vector<InputUser>\"},{\"name\":\"title\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":651135312,\"method\":\"messages.getDhConfig\",\"params\":[{\"name\":\"version\",\"type\":\"int\"},{\"name\":\"random_length\",\"type\":\"int\"}],\"type\":\"messages.DhConfig\"},{\"id\":-162681021,\"method\":\"messages.requestEncryption\",\"params\":[{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"random_id\",\"type\":\"int\"},{\"name\":\"g_a\",\"type\":\"bytes\"}],\"type\":\"EncryptedChat\"},{\"id\":1035731989,\"method\":\"messages.acceptEncryption\",\"params\":[{\"name\":\"peer\",\"type\":\"InputEncryptedChat\"},{\"name\":\"g_b\",\"type\":\"bytes\"},{\"name\":\"key_fingerprint\",\"type\":\"long\"}],\"type\":\"EncryptedChat\"},{\"id\":-208425312,\"method\":\"messages.discardEncryption\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"delete_history\",\"type\":\"flags.0?true\"},{\"name\":\"chat_id\",\"type\":\"int\"}],\"type\":\"Bool\"},{\"id\":2031374829,\"method\":\"messages.setEncryptedTyping\",\"params\":[{\"name\":\"peer\",\"type\":\"InputEncryptedChat\"},{\"name\":\"typing\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":2135648522,\"method\":\"messages.readEncryptedHistory\",\"params\":[{\"name\":\"peer\",\"type\":\"InputEncryptedChat\"},{\"name\":\"max_date\",\"type\":\"int\"}],\"type\":\"Bool\"},{\"id\":1157265941,\"method\":\"messages.sendEncrypted\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"silent\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"InputEncryptedChat\"},{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"data\",\"type\":\"bytes\"}],\"type\":\"messages.SentEncryptedMessage\"},{\"id\":1431914525,\"method\":\"messages.sendEncryptedFile\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"silent\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"InputEncryptedChat\"},{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"data\",\"type\":\"bytes\"},{\"name\":\"file\",\"type\":\"InputEncryptedFile\"}],\"type\":\"messages.SentEncryptedMessage\"},{\"id\":852769188,\"method\":\"messages.sendEncryptedService\",\"params\":[{\"name\":\"peer\",\"type\":\"InputEncryptedChat\"},{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"data\",\"type\":\"bytes\"}],\"type\":\"messages.SentEncryptedMessage\"},{\"id\":1436924774,\"method\":\"messages.receivedQueue\",\"params\":[{\"name\":\"max_qts\",\"type\":\"int\"}],\"type\":\"Vector<long>\"},{\"id\":1259113487,\"method\":\"messages.reportEncryptedSpam\",\"params\":[{\"name\":\"peer\",\"type\":\"InputEncryptedChat\"}],\"type\":\"Bool\"},{\"id\":916930423,\"method\":\"messages.readMessageContents\",\"params\":[{\"name\":\"id\",\"type\":\"Vector<int>\"}],\"type\":\"messages.AffectedMessages\"},{\"id\":-710552671,\"method\":\"messages.getStickers\",\"params\":[{\"name\":\"emoticon\",\"type\":\"string\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.Stickers\"},{\"id\":-1197432408,\"method\":\"messages.getAllStickers\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.AllStickers\"},{\"id\":-1956073268,\"method\":\"messages.getWebPagePreview\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"flags.3?Vector<MessageEntity>\"}],\"type\":\"MessageMedia\"},{\"id\":-1607670315,\"method\":\"messages.exportChatInvite\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"legacy_revoke_permanent\",\"type\":\"flags.2?true\"},{\"name\":\"request_needed\",\"type\":\"flags.3?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"expire_date\",\"type\":\"flags.0?int\"},{\"name\":\"usage_limit\",\"type\":\"flags.1?int\"},{\"name\":\"title\",\"type\":\"flags.4?string\"}],\"type\":\"ExportedChatInvite\"},{\"id\":1051570619,\"method\":\"messages.checkChatInvite\",\"params\":[{\"name\":\"hash\",\"type\":\"string\"}],\"type\":\"ChatInvite\"},{\"id\":1817183516,\"method\":\"messages.importChatInvite\",\"params\":[{\"name\":\"hash\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":-928977804,\"method\":\"messages.getStickerSet\",\"params\":[{\"name\":\"stickerset\",\"type\":\"InputStickerSet\"},{\"name\":\"hash\",\"type\":\"int\"}],\"type\":\"messages.StickerSet\"},{\"id\":-946871200,\"method\":\"messages.installStickerSet\",\"params\":[{\"name\":\"stickerset\",\"type\":\"InputStickerSet\"},{\"name\":\"archived\",\"type\":\"Bool\"}],\"type\":\"messages.StickerSetInstallResult\"},{\"id\":-110209570,\"method\":\"messages.uninstallStickerSet\",\"params\":[{\"name\":\"stickerset\",\"type\":\"InputStickerSet\"}],\"type\":\"Bool\"},{\"id\":-421563528,\"method\":\"messages.startBot\",\"params\":[{\"name\":\"bot\",\"type\":\"InputUser\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"start_param\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":1468322785,\"method\":\"messages.getMessagesViews\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"Vector<int>\"},{\"name\":\"increment\",\"type\":\"Bool\"}],\"type\":\"messages.MessageViews\"},{\"id\":-1470377534,\"method\":\"messages.editChatAdmin\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"is_admin\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":-1568189671,\"method\":\"messages.migrateChat\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"}],\"type\":\"Updates\"},{\"id\":1271290010,\"method\":\"messages.searchGlobal\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"folder_id\",\"type\":\"flags.0?int\"},{\"name\":\"q\",\"type\":\"string\"},{\"name\":\"filter\",\"type\":\"MessagesFilter\"},{\"name\":\"min_date\",\"type\":\"int\"},{\"name\":\"max_date\",\"type\":\"int\"},{\"name\":\"offset_rate\",\"type\":\"int\"},{\"name\":\"offset_peer\",\"type\":\"InputPeer\"},{\"name\":\"offset_id\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"messages.Messages\"},{\"id\":2016638777,\"method\":\"messages.reorderStickerSets\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"masks\",\"type\":\"flags.0?true\"},{\"name\":\"order\",\"type\":\"Vector<long>\"}],\"type\":\"Bool\"},{\"id\":864953444,\"method\":\"messages.getDocumentByHash\",\"params\":[{\"name\":\"sha256\",\"type\":\"bytes\"},{\"name\":\"size\",\"type\":\"int\"},{\"name\":\"mime_type\",\"type\":\"string\"}],\"type\":\"Document\"},{\"id\":1559270965,\"method\":\"messages.getSavedGifs\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.SavedGifs\"},{\"id\":846868683,\"method\":\"messages.saveGif\",\"params\":[{\"name\":\"id\",\"type\":\"InputDocument\"},{\"name\":\"unsave\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":1364105629,\"method\":\"messages.getInlineBotResults\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"bot\",\"type\":\"InputUser\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"geo_point\",\"type\":\"flags.0?InputGeoPoint\"},{\"name\":\"query\",\"type\":\"string\"},{\"name\":\"offset\",\"type\":\"string\"}],\"type\":\"messages.BotResults\"},{\"id\":-346119674,\"method\":\"messages.setInlineBotResults\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"gallery\",\"type\":\"flags.0?true\"},{\"name\":\"private\",\"type\":\"flags.1?true\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"results\",\"type\":\"Vector<InputBotInlineResult>\"},{\"name\":\"cache_time\",\"type\":\"int\"},{\"name\":\"next_offset\",\"type\":\"flags.2?string\"},{\"name\":\"switch_pm\",\"type\":\"flags.3?InlineBotSwitchPM\"}],\"type\":\"Bool\"},{\"id\":2057376407,\"method\":\"messages.sendInlineBotResult\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"silent\",\"type\":\"flags.5?true\"},{\"name\":\"background\",\"type\":\"flags.6?true\"},{\"name\":\"clear_draft\",\"type\":\"flags.7?true\"},{\"name\":\"hide_via\",\"type\":\"flags.11?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"reply_to_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"schedule_date\",\"type\":\"flags.10?int\"},{\"name\":\"send_as\",\"type\":\"flags.13?InputPeer\"}],\"type\":\"Updates\"},{\"id\":-39416522,\"method\":\"messages.getMessageEditData\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"int\"}],\"type\":\"messages.MessageEditData\"},{\"id\":1224152952,\"method\":\"messages.editMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"no_webpage\",\"type\":\"flags.1?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"message\",\"type\":\"flags.11?string\"},{\"name\":\"media\",\"type\":\"flags.14?InputMedia\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"},{\"name\":\"entities\",\"type\":\"flags.3?Vector<MessageEntity>\"},{\"name\":\"schedule_date\",\"type\":\"flags.15?int\"}],\"type\":\"Updates\"},{\"id\":-2091549254,\"method\":\"messages.editInlineBotMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"no_webpage\",\"type\":\"flags.1?true\"},{\"name\":\"id\",\"type\":\"InputBotInlineMessageID\"},{\"name\":\"message\",\"type\":\"flags.11?string\"},{\"name\":\"media\",\"type\":\"flags.14?InputMedia\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"},{\"name\":\"entities\",\"type\":\"flags.3?Vector<MessageEntity>\"}],\"type\":\"Bool\"},{\"id\":-1824339449,\"method\":\"messages.getBotCallbackAnswer\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"game\",\"type\":\"flags.1?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"data\",\"type\":\"flags.0?bytes\"},{\"name\":\"password\",\"type\":\"flags.2?InputCheckPasswordSRP\"}],\"type\":\"messages.BotCallbackAnswer\"},{\"id\":-712043766,\"method\":\"messages.setBotCallbackAnswer\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"alert\",\"type\":\"flags.1?true\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"message\",\"type\":\"flags.0?string\"},{\"name\":\"url\",\"type\":\"flags.2?string\"},{\"name\":\"cache_time\",\"type\":\"int\"}],\"type\":\"Bool\"},{\"id\":-462373635,\"method\":\"messages.getPeerDialogs\",\"params\":[{\"name\":\"peers\",\"type\":\"Vector<InputDialogPeer>\"}],\"type\":\"messages.PeerDialogs\"},{\"id\":-1137057461,\"method\":\"messages.saveDraft\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"no_webpage\",\"type\":\"flags.1?true\"},{\"name\":\"reply_to_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"flags.3?Vector<MessageEntity>\"}],\"type\":\"Bool\"},{\"id\":1782549861,\"method\":\"messages.getAllDrafts\",\"params\":[],\"type\":\"Updates\"},{\"id\":1685588756,\"method\":\"messages.getFeaturedStickers\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.FeaturedStickers\"},{\"id\":1527873830,\"method\":\"messages.readFeaturedStickers\",\"params\":[{\"name\":\"id\",\"type\":\"Vector<long>\"}],\"type\":\"Bool\"},{\"id\":-1649852357,\"method\":\"messages.getRecentStickers\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"attached\",\"type\":\"flags.0?true\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.RecentStickers\"},{\"id\":958863608,\"method\":\"messages.saveRecentSticker\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"attached\",\"type\":\"flags.0?true\"},{\"name\":\"id\",\"type\":\"InputDocument\"},{\"name\":\"unsave\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":-1986437075,\"method\":\"messages.clearRecentStickers\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"attached\",\"type\":\"flags.0?true\"}],\"type\":\"Bool\"},{\"id\":1475442322,\"method\":\"messages.getArchivedStickers\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"masks\",\"type\":\"flags.0?true\"},{\"name\":\"offset_id\",\"type\":\"long\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"messages.ArchivedStickers\"},{\"id\":1678738104,\"method\":\"messages.getMaskStickers\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.AllStickers\"},{\"id\":-866424884,\"method\":\"messages.getAttachedStickers\",\"params\":[{\"name\":\"media\",\"type\":\"InputStickeredMedia\"}],\"type\":\"Vector<StickerSetCovered>\"},{\"id\":-1896289088,\"method\":\"messages.setGameScore\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"edit_message\",\"type\":\"flags.0?true\"},{\"name\":\"force\",\"type\":\"flags.1?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"score\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":363700068,\"method\":\"messages.setInlineGameScore\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"edit_message\",\"type\":\"flags.0?true\"},{\"name\":\"force\",\"type\":\"flags.1?true\"},{\"name\":\"id\",\"type\":\"InputBotInlineMessageID\"},{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"score\",\"type\":\"int\"}],\"type\":\"Bool\"},{\"id\":-400399203,\"method\":\"messages.getGameHighScores\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"InputUser\"}],\"type\":\"messages.HighScores\"},{\"id\":258170395,\"method\":\"messages.getInlineGameHighScores\",\"params\":[{\"name\":\"id\",\"type\":\"InputBotInlineMessageID\"},{\"name\":\"user_id\",\"type\":\"InputUser\"}],\"type\":\"messages.HighScores\"},{\"id\":-468934396,\"method\":\"messages.getCommonChats\",\"params\":[{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"max_id\",\"type\":\"long\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"messages.Chats\"},{\"id\":-2023787330,\"method\":\"messages.getAllChats\",\"params\":[{\"name\":\"except_ids\",\"type\":\"Vector<long>\"}],\"type\":\"messages.Chats\"},{\"id\":852135825,\"method\":\"messages.getWebPage\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"hash\",\"type\":\"int\"}],\"type\":\"WebPage\"},{\"id\":-1489903017,\"method\":\"messages.toggleDialogPin\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"pinned\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"InputDialogPeer\"}],\"type\":\"Bool\"},{\"id\":991616823,\"method\":\"messages.reorderPinnedDialogs\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"force\",\"type\":\"flags.0?true\"},{\"name\":\"folder_id\",\"type\":\"int\"},{\"name\":\"order\",\"type\":\"Vector<InputDialogPeer>\"}],\"type\":\"Bool\"},{\"id\":-692498958,\"method\":\"messages.getPinnedDialogs\",\"params\":[{\"name\":\"folder_id\",\"type\":\"int\"}],\"type\":\"messages.PeerDialogs\"},{\"id\":-436833542,\"method\":\"messages.setBotShippingResults\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"error\",\"type\":\"flags.0?string\"},{\"name\":\"shipping_options\",\"type\":\"flags.1?Vector<ShippingOption>\"}],\"type\":\"Bool\"},{\"id\":163765653,\"method\":\"messages.setBotPrecheckoutResults\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"success\",\"type\":\"flags.1?true\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"error\",\"type\":\"flags.0?string\"}],\"type\":\"Bool\"},{\"id\":1369162417,\"method\":\"messages.uploadMedia\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"media\",\"type\":\"InputMedia\"}],\"type\":\"MessageMedia\"},{\"id\":-914493408,\"method\":\"messages.sendScreenshotNotification\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"reply_to_msg_id\",\"type\":\"int\"},{\"name\":\"random_id\",\"type\":\"long\"}],\"type\":\"Updates\"},{\"id\":82946729,\"method\":\"messages.getFavedStickers\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.FavedStickers\"},{\"id\":-1174420133,\"method\":\"messages.faveSticker\",\"params\":[{\"name\":\"id\",\"type\":\"InputDocument\"},{\"name\":\"unfave\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":1180140658,\"method\":\"messages.getUnreadMentions\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"offset_id\",\"type\":\"int\"},{\"name\":\"add_offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"max_id\",\"type\":\"int\"},{\"name\":\"min_id\",\"type\":\"int\"}],\"type\":\"messages.Messages\"},{\"id\":251759059,\"method\":\"messages.readMentions\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"messages.AffectedHistory\"},{\"id\":1881817312,\"method\":\"messages.getRecentLocations\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.Messages\"},{\"id\":-134016113,\"method\":\"messages.sendMultiMedia\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"silent\",\"type\":\"flags.5?true\"},{\"name\":\"background\",\"type\":\"flags.6?true\"},{\"name\":\"clear_draft\",\"type\":\"flags.7?true\"},{\"name\":\"noforwards\",\"type\":\"flags.14?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"reply_to_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"multi_media\",\"type\":\"Vector<InputSingleMedia>\"},{\"name\":\"schedule_date\",\"type\":\"flags.10?int\"},{\"name\":\"send_as\",\"type\":\"flags.13?InputPeer\"}],\"type\":\"Updates\"},{\"id\":1347929239,\"method\":\"messages.uploadEncryptedFile\",\"params\":[{\"name\":\"peer\",\"type\":\"InputEncryptedChat\"},{\"name\":\"file\",\"type\":\"InputEncryptedFile\"}],\"type\":\"EncryptedFile\"},{\"id\":896555914,\"method\":\"messages.searchStickerSets\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"exclude_featured\",\"type\":\"flags.0?true\"},{\"name\":\"q\",\"type\":\"string\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.FoundStickerSets\"},{\"id\":486505992,\"method\":\"messages.getSplitRanges\",\"params\":[],\"type\":\"Vector<MessageRange>\"},{\"id\":-1031349873,\"method\":\"messages.markDialogUnread\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"unread\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"InputDialogPeer\"}],\"type\":\"Bool\"},{\"id\":585256482,\"method\":\"messages.getDialogUnreadMarks\",\"params\":[],\"type\":\"Vector<DialogPeer>\"},{\"id\":2119757468,\"method\":\"messages.clearAllDrafts\",\"params\":[],\"type\":\"Bool\"},{\"id\":-760547348,\"method\":\"messages.updatePinnedMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"silent\",\"type\":\"flags.0?true\"},{\"name\":\"unpin\",\"type\":\"flags.1?true\"},{\"name\":\"pm_oneside\",\"type\":\"flags.2?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":283795844,\"method\":\"messages.sendVote\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"options\",\"type\":\"Vector<bytes>\"}],\"type\":\"Updates\"},{\"id\":1941660731,\"method\":\"messages.getPollResults\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":1848369232,\"method\":\"messages.getOnlines\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"ChatOnlines\"},{\"id\":-554301545,\"method\":\"messages.editChatAbout\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"about\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":-1517917375,\"method\":\"messages.editChatDefaultBannedRights\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"banned_rights\",\"type\":\"ChatBannedRights\"}],\"type\":\"Updates\"},{\"id\":899735650,\"method\":\"messages.getEmojiKeywords\",\"params\":[{\"name\":\"lang_code\",\"type\":\"string\"}],\"type\":\"EmojiKeywordsDifference\"},{\"id\":352892591,\"method\":\"messages.getEmojiKeywordsDifference\",\"params\":[{\"name\":\"lang_code\",\"type\":\"string\"},{\"name\":\"from_version\",\"type\":\"int\"}],\"type\":\"EmojiKeywordsDifference\"},{\"id\":1318675378,\"method\":\"messages.getEmojiKeywordsLanguages\",\"params\":[{\"name\":\"lang_codes\",\"type\":\"Vector<string>\"}],\"type\":\"Vector<EmojiLanguage>\"},{\"id\":-709817306,\"method\":\"messages.getEmojiURL\",\"params\":[{\"name\":\"lang_code\",\"type\":\"string\"}],\"type\":\"EmojiURL\"},{\"id\":1932455680,\"method\":\"messages.getSearchCounters\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"filters\",\"type\":\"Vector<MessagesFilter>\"}],\"type\":\"Vector<messages.SearchCounter>\"},{\"id\":428848198,\"method\":\"messages.requestUrlAuth\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"flags.1?InputPeer\"},{\"name\":\"msg_id\",\"type\":\"flags.1?int\"},{\"name\":\"button_id\",\"type\":\"flags.1?int\"},{\"name\":\"url\",\"type\":\"flags.2?string\"}],\"type\":\"UrlAuthResult\"},{\"id\":-1322487515,\"method\":\"messages.acceptUrlAuth\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"write_allowed\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"flags.1?InputPeer\"},{\"name\":\"msg_id\",\"type\":\"flags.1?int\"},{\"name\":\"button_id\",\"type\":\"flags.1?int\"},{\"name\":\"url\",\"type\":\"flags.2?string\"}],\"type\":\"UrlAuthResult\"},{\"id\":1336717624,\"method\":\"messages.hidePeerSettingsBar\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"Bool\"},{\"id\":-183077365,\"method\":\"messages.getScheduledHistory\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.Messages\"},{\"id\":-1111817116,\"method\":\"messages.getScheduledMessages\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"Vector<int>\"}],\"type\":\"messages.Messages\"},{\"id\":-1120369398,\"method\":\"messages.sendScheduledMessages\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"Vector<int>\"}],\"type\":\"Updates\"},{\"id\":1504586518,\"method\":\"messages.deleteScheduledMessages\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"Vector<int>\"}],\"type\":\"Updates\"},{\"id\":-1200736242,\"method\":\"messages.getPollVotes\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"option\",\"type\":\"flags.0?bytes\"},{\"name\":\"offset\",\"type\":\"flags.1?string\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"messages.VotesList\"},{\"id\":-1257951254,\"method\":\"messages.toggleStickerSets\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"uninstall\",\"type\":\"flags.0?true\"},{\"name\":\"archive\",\"type\":\"flags.1?true\"},{\"name\":\"unarchive\",\"type\":\"flags.2?true\"},{\"name\":\"stickersets\",\"type\":\"Vector<InputStickerSet>\"}],\"type\":\"Bool\"},{\"id\":-241247891,\"method\":\"messages.getDialogFilters\",\"params\":[],\"type\":\"Vector<DialogFilter>\"},{\"id\":-1566780372,\"method\":\"messages.getSuggestedDialogFilters\",\"params\":[],\"type\":\"Vector<DialogFilterSuggested>\"},{\"id\":450142282,\"method\":\"messages.updateDialogFilter\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"filter\",\"type\":\"flags.0?DialogFilter\"}],\"type\":\"Bool\"},{\"id\":-983318044,\"method\":\"messages.updateDialogFiltersOrder\",\"params\":[{\"name\":\"order\",\"type\":\"Vector<int>\"}],\"type\":\"Bool\"},{\"id\":2127598753,\"method\":\"messages.getOldFeaturedStickers\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.FeaturedStickers\"},{\"id\":584962828,\"method\":\"messages.getReplies\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"offset_id\",\"type\":\"int\"},{\"name\":\"offset_date\",\"type\":\"int\"},{\"name\":\"add_offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"max_id\",\"type\":\"int\"},{\"name\":\"min_id\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.Messages\"},{\"id\":1147761405,\"method\":\"messages.getDiscussionMessage\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"}],\"type\":\"messages.DiscussionMessage\"},{\"id\":-147740172,\"method\":\"messages.readDiscussion\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"read_max_id\",\"type\":\"int\"}],\"type\":\"Bool\"},{\"id\":-265962357,\"method\":\"messages.unpinAllMessages\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"messages.AffectedHistory\"},{\"id\":1540419152,\"method\":\"messages.deleteChat\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"}],\"type\":\"Bool\"},{\"id\":-104078327,\"method\":\"messages.deletePhoneCallHistory\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"revoke\",\"type\":\"flags.0?true\"}],\"type\":\"messages.AffectedFoundMessages\"},{\"id\":1140726259,\"method\":\"messages.checkHistoryImport\",\"params\":[{\"name\":\"import_head\",\"type\":\"string\"}],\"type\":\"messages.HistoryImportParsed\"},{\"id\":873008187,\"method\":\"messages.initHistoryImport\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"file\",\"type\":\"InputFile\"},{\"name\":\"media_count\",\"type\":\"int\"}],\"type\":\"messages.HistoryImport\"},{\"id\":713433234,\"method\":\"messages.uploadImportedMedia\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"import_id\",\"type\":\"long\"},{\"name\":\"file_name\",\"type\":\"string\"},{\"name\":\"media\",\"type\":\"InputMedia\"}],\"type\":\"MessageMedia\"},{\"id\":-1271008444,\"method\":\"messages.startHistoryImport\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"import_id\",\"type\":\"long\"}],\"type\":\"Bool\"},{\"id\":-1565154314,\"method\":\"messages.getExportedChatInvites\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"revoked\",\"type\":\"flags.3?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"admin_id\",\"type\":\"InputUser\"},{\"name\":\"offset_date\",\"type\":\"flags.2?int\"},{\"name\":\"offset_link\",\"type\":\"flags.2?string\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"messages.ExportedChatInvites\"},{\"id\":1937010524,\"method\":\"messages.getExportedChatInvite\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"link\",\"type\":\"string\"}],\"type\":\"messages.ExportedChatInvite\"},{\"id\":-1110823051,\"method\":\"messages.editExportedChatInvite\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"revoked\",\"type\":\"flags.2?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"link\",\"type\":\"string\"},{\"name\":\"expire_date\",\"type\":\"flags.0?int\"},{\"name\":\"usage_limit\",\"type\":\"flags.1?int\"},{\"name\":\"request_needed\",\"type\":\"flags.3?Bool\"},{\"name\":\"title\",\"type\":\"flags.4?string\"}],\"type\":\"messages.ExportedChatInvite\"},{\"id\":1452833749,\"method\":\"messages.deleteRevokedExportedChatInvites\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"admin_id\",\"type\":\"InputUser\"}],\"type\":\"Bool\"},{\"id\":-731601877,\"method\":\"messages.deleteExportedChatInvite\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"link\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":958457583,\"method\":\"messages.getAdminsWithInvites\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"messages.ChatAdminsWithInvites\"},{\"id\":-553329330,\"method\":\"messages.getChatInviteImporters\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"requested\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"link\",\"type\":\"flags.1?string\"},{\"name\":\"q\",\"type\":\"flags.2?string\"},{\"name\":\"offset_date\",\"type\":\"int\"},{\"name\":\"offset_user\",\"type\":\"InputUser\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"messages.ChatInviteImporters\"},{\"id\":-1207017500,\"method\":\"messages.setHistoryTTL\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"period\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":1573261059,\"method\":\"messages.checkHistoryImportPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"messages.CheckedHistoryImportPeer\"},{\"id\":-432283329,\"method\":\"messages.setChatTheme\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"emoticon\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":745510839,\"method\":\"messages.getMessageReadParticipants\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"}],\"type\":\"Vector<long>\"},{\"id\":1240514025,\"method\":\"messages.getSearchResultsCalendar\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"filter\",\"type\":\"MessagesFilter\"},{\"name\":\"offset_id\",\"type\":\"int\"},{\"name\":\"offset_date\",\"type\":\"int\"}],\"type\":\"messages.SearchResultsCalendar\"},{\"id\":1855292323,\"method\":\"messages.getSearchResultsPositions\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"filter\",\"type\":\"MessagesFilter\"},{\"name\":\"offset_id\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"messages.SearchResultsPositions\"},{\"id\":2145904661,\"method\":\"messages.hideChatJoinRequest\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"approved\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"user_id\",\"type\":\"InputUser\"}],\"type\":\"Updates\"},{\"id\":-528091926,\"method\":\"messages.hideAllChatJoinRequests\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"approved\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"link\",\"type\":\"flags.1?string\"}],\"type\":\"Updates\"},{\"id\":-1323389022,\"method\":\"messages.toggleNoForwards\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"enabled\",\"type\":\"Bool\"}],\"type\":\"Updates\"},{\"id\":-855777386,\"method\":\"messages.saveDefaultSendAs\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"send_as\",\"type\":\"InputPeer\"}],\"type\":\"Bool\"},{\"id\":627641572,\"method\":\"messages.sendReaction\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"reaction\",\"type\":\"flags.0?string\"}],\"type\":\"Updates\"},{\"id\":-1950707482,\"method\":\"messages.getMessagesReactions\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"Vector<int>\"}],\"type\":\"Updates\"},{\"id\":-521245833,\"method\":\"messages.getMessageReactionsList\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"reaction\",\"type\":\"flags.0?string\"},{\"name\":\"offset\",\"type\":\"flags.1?string\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"messages.MessageReactionsList\"},{\"id\":335875750,\"method\":\"messages.setChatAvailableReactions\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"available_reactions\",\"type\":\"Vector<string>\"}],\"type\":\"Updates\"},{\"id\":417243308,\"method\":\"messages.getAvailableReactions\",\"params\":[{\"name\":\"hash\",\"type\":\"int\"}],\"type\":\"messages.AvailableReactions\"},{\"id\":-647969580,\"method\":\"messages.setDefaultReaction\",\"params\":[{\"name\":\"reaction\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":-304838614,\"method\":\"updates.getState\",\"params\":[],\"type\":\"updates.State\"},{\"id\":630429265,\"method\":\"updates.getDifference\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_total_limit\",\"type\":\"flags.0?int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"qts\",\"type\":\"int\"}],\"type\":\"updates.Difference\"},{\"id\":51854712,\"method\":\"updates.getChannelDifference\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"force\",\"type\":\"flags.0?true\"},{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"filter\",\"type\":\"ChannelMessagesFilter\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"updates.ChannelDifference\"},{\"id\":1926525996,\"method\":\"photos.updateProfilePhoto\",\"params\":[{\"name\":\"id\",\"type\":\"InputPhoto\"}],\"type\":\"photos.Photo\"},{\"id\":-1980559511,\"method\":\"photos.uploadProfilePhoto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"file\",\"type\":\"flags.0?InputFile\"},{\"name\":\"video\",\"type\":\"flags.1?InputFile\"},{\"name\":\"video_start_ts\",\"type\":\"flags.2?double\"}],\"type\":\"photos.Photo\"},{\"id\":-2016444625,\"method\":\"photos.deletePhotos\",\"params\":[{\"name\":\"id\",\"type\":\"Vector<InputPhoto>\"}],\"type\":\"Vector<long>\"},{\"id\":-1848823128,\"method\":\"photos.getUserPhotos\",\"params\":[{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"max_id\",\"type\":\"long\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"photos.Photos\"},{\"id\":-1291540959,\"method\":\"upload.saveFilePart\",\"params\":[{\"name\":\"file_id\",\"type\":\"long\"},{\"name\":\"file_part\",\"type\":\"int\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"Bool\"},{\"id\":-1319462148,\"method\":\"upload.getFile\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"precise\",\"type\":\"flags.0?true\"},{\"name\":\"cdn_supported\",\"type\":\"flags.1?true\"},{\"name\":\"location\",\"type\":\"InputFileLocation\"},{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"upload.File\"},{\"id\":-562337987,\"method\":\"upload.saveBigFilePart\",\"params\":[{\"name\":\"file_id\",\"type\":\"long\"},{\"name\":\"file_part\",\"type\":\"int\"},{\"name\":\"file_total_parts\",\"type\":\"int\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"Bool\"},{\"id\":619086221,\"method\":\"upload.getWebFile\",\"params\":[{\"name\":\"location\",\"type\":\"InputWebFileLocation\"},{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"upload.WebFile\"},{\"id\":536919235,\"method\":\"upload.getCdnFile\",\"params\":[{\"name\":\"file_token\",\"type\":\"bytes\"},{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"upload.CdnFile\"},{\"id\":-1691921240,\"method\":\"upload.reuploadCdnFile\",\"params\":[{\"name\":\"file_token\",\"type\":\"bytes\"},{\"name\":\"request_token\",\"type\":\"bytes\"}],\"type\":\"Vector<FileHash>\"},{\"id\":1302676017,\"method\":\"upload.getCdnFileHashes\",\"params\":[{\"name\":\"file_token\",\"type\":\"bytes\"},{\"name\":\"offset\",\"type\":\"int\"}],\"type\":\"Vector<FileHash>\"},{\"id\":-956147407,\"method\":\"upload.getFileHashes\",\"params\":[{\"name\":\"location\",\"type\":\"InputFileLocation\"},{\"name\":\"offset\",\"type\":\"int\"}],\"type\":\"Vector<FileHash>\"},{\"id\":-990308245,\"method\":\"help.getConfig\",\"params\":[],\"type\":\"Config\"},{\"id\":531836966,\"method\":\"help.getNearestDc\",\"params\":[],\"type\":\"NearestDc\"},{\"id\":1378703997,\"method\":\"help.getAppUpdate\",\"params\":[{\"name\":\"source\",\"type\":\"string\"}],\"type\":\"help.AppUpdate\"},{\"id\":1295590211,\"method\":\"help.getInviteText\",\"params\":[],\"type\":\"help.InviteText\"},{\"id\":-1663104819,\"method\":\"help.getSupport\",\"params\":[],\"type\":\"help.Support\"},{\"id\":-1877938321,\"method\":\"help.getAppChangelog\",\"params\":[{\"name\":\"prev_app_version\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":-333262899,\"method\":\"help.setBotUpdatesStatus\",\"params\":[{\"name\":\"pending_updates_count\",\"type\":\"int\"},{\"name\":\"message\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":1375900482,\"method\":\"help.getCdnConfig\",\"params\":[],\"type\":\"CdnConfig\"},{\"id\":1036054804,\"method\":\"help.getRecentMeUrls\",\"params\":[{\"name\":\"referer\",\"type\":\"string\"}],\"type\":\"help.RecentMeUrls\"},{\"id\":749019089,\"method\":\"help.getTermsOfServiceUpdate\",\"params\":[],\"type\":\"help.TermsOfServiceUpdate\"},{\"id\":-294455398,\"method\":\"help.acceptTermsOfService\",\"params\":[{\"name\":\"id\",\"type\":\"DataJSON\"}],\"type\":\"Bool\"},{\"id\":1072547679,\"method\":\"help.getDeepLinkInfo\",\"params\":[{\"name\":\"path\",\"type\":\"string\"}],\"type\":\"help.DeepLinkInfo\"},{\"id\":-1735311088,\"method\":\"help.getAppConfig\",\"params\":[],\"type\":\"JSONValue\"},{\"id\":1862465352,\"method\":\"help.saveAppLog\",\"params\":[{\"name\":\"events\",\"type\":\"Vector<InputAppEvent>\"}],\"type\":\"Bool\"},{\"id\":-966677240,\"method\":\"help.getPassportConfig\",\"params\":[{\"name\":\"hash\",\"type\":\"int\"}],\"type\":\"help.PassportConfig\"},{\"id\":-748624084,\"method\":\"help.getSupportName\",\"params\":[],\"type\":\"help.SupportName\"},{\"id\":59377875,\"method\":\"help.getUserInfo\",\"params\":[{\"name\":\"user_id\",\"type\":\"InputUser\"}],\"type\":\"help.UserInfo\"},{\"id\":1723407216,\"method\":\"help.editUserInfo\",\"params\":[{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"Vector<MessageEntity>\"}],\"type\":\"help.UserInfo\"},{\"id\":-1063816159,\"method\":\"help.getPromoData\",\"params\":[],\"type\":\"help.PromoData\"},{\"id\":505748629,\"method\":\"help.hidePromoData\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"Bool\"},{\"id\":-183649631,\"method\":\"help.dismissSuggestion\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"suggestion\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":1935116200,\"method\":\"help.getCountriesList\",\"params\":[{\"name\":\"lang_code\",\"type\":\"string\"},{\"name\":\"hash\",\"type\":\"int\"}],\"type\":\"help.CountriesList\"},{\"id\":-871347913,\"method\":\"channels.readHistory\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"max_id\",\"type\":\"int\"}],\"type\":\"Bool\"},{\"id\":-2067661490,\"method\":\"channels.deleteMessages\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"id\",\"type\":\"Vector<int>\"}],\"type\":\"messages.AffectedMessages\"},{\"id\":-196443371,\"method\":\"channels.reportSpam\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"participant\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"Vector<int>\"}],\"type\":\"Bool\"},{\"id\":-1383294429,\"method\":\"channels.getMessages\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"id\",\"type\":\"Vector<InputMessage>\"}],\"type\":\"messages.Messages\"},{\"id\":2010044880,\"method\":\"channels.getParticipants\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"filter\",\"type\":\"ChannelParticipantsFilter\"},{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"channels.ChannelParticipants\"},{\"id\":-1599378234,\"method\":\"channels.getParticipant\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"participant\",\"type\":\"InputPeer\"}],\"type\":\"channels.ChannelParticipant\"},{\"id\":176122811,\"method\":\"channels.getChannels\",\"params\":[{\"name\":\"id\",\"type\":\"Vector<InputChannel>\"}],\"type\":\"messages.Chats\"},{\"id\":141781513,\"method\":\"channels.getFullChannel\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"}],\"type\":\"messages.ChatFull\"},{\"id\":1029681423,\"method\":\"channels.createChannel\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"broadcast\",\"type\":\"flags.0?true\"},{\"name\":\"megagroup\",\"type\":\"flags.1?true\"},{\"name\":\"for_import\",\"type\":\"flags.3?true\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"about\",\"type\":\"string\"},{\"name\":\"geo_point\",\"type\":\"flags.2?InputGeoPoint\"},{\"name\":\"address\",\"type\":\"flags.2?string\"}],\"type\":\"Updates\"},{\"id\":-751007486,\"method\":\"channels.editAdmin\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"admin_rights\",\"type\":\"ChatAdminRights\"},{\"name\":\"rank\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":1450044624,\"method\":\"channels.editTitle\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"title\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":-248621111,\"method\":\"channels.editPhoto\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"photo\",\"type\":\"InputChatPhoto\"}],\"type\":\"Updates\"},{\"id\":283557164,\"method\":\"channels.checkUsername\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"username\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":890549214,\"method\":\"channels.updateUsername\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"username\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":615851205,\"method\":\"channels.joinChannel\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"}],\"type\":\"Updates\"},{\"id\":-130635115,\"method\":\"channels.leaveChannel\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"}],\"type\":\"Updates\"},{\"id\":429865580,\"method\":\"channels.inviteToChannel\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"users\",\"type\":\"Vector<InputUser>\"}],\"type\":\"Updates\"},{\"id\":-1072619549,\"method\":\"channels.deleteChannel\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"}],\"type\":\"Updates\"},{\"id\":-432034325,\"method\":\"channels.exportMessageLink\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"grouped\",\"type\":\"flags.0?true\"},{\"name\":\"thread\",\"type\":\"flags.1?true\"},{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"id\",\"type\":\"int\"}],\"type\":\"ExportedMessageLink\"},{\"id\":527021574,\"method\":\"channels.toggleSignatures\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"enabled\",\"type\":\"Bool\"}],\"type\":\"Updates\"},{\"id\":-122669393,\"method\":\"channels.getAdminedPublicChannels\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"by_location\",\"type\":\"flags.0?true\"},{\"name\":\"check_limit\",\"type\":\"flags.1?true\"}],\"type\":\"messages.Chats\"},{\"id\":-1763259007,\"method\":\"channels.editBanned\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"participant\",\"type\":\"InputPeer\"},{\"name\":\"banned_rights\",\"type\":\"ChatBannedRights\"}],\"type\":\"Updates\"},{\"id\":870184064,\"method\":\"channels.getAdminLog\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"q\",\"type\":\"string\"},{\"name\":\"events_filter\",\"type\":\"flags.0?ChannelAdminLogEventsFilter\"},{\"name\":\"admins\",\"type\":\"flags.1?Vector<InputUser>\"},{\"name\":\"max_id\",\"type\":\"long\"},{\"name\":\"min_id\",\"type\":\"long\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"channels.AdminLogResults\"},{\"id\":-359881479,\"method\":\"channels.setStickers\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"stickerset\",\"type\":\"InputStickerSet\"}],\"type\":\"Bool\"},{\"id\":-357180360,\"method\":\"channels.readMessageContents\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"id\",\"type\":\"Vector<int>\"}],\"type\":\"Bool\"},{\"id\":-1355375294,\"method\":\"channels.deleteHistory\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"max_id\",\"type\":\"int\"}],\"type\":\"Bool\"},{\"id\":-356796084,\"method\":\"channels.togglePreHistoryHidden\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"enabled\",\"type\":\"Bool\"}],\"type\":\"Updates\"},{\"id\":-2092831552,\"method\":\"channels.getLeftChannels\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"}],\"type\":\"messages.Chats\"},{\"id\":-170208392,\"method\":\"channels.getGroupsForDiscussion\",\"params\":[],\"type\":\"messages.Chats\"},{\"id\":1079520178,\"method\":\"channels.setDiscussionGroup\",\"params\":[{\"name\":\"broadcast\",\"type\":\"InputChannel\"},{\"name\":\"group\",\"type\":\"InputChannel\"}],\"type\":\"Bool\"},{\"id\":-1892102881,\"method\":\"channels.editCreator\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"password\",\"type\":\"InputCheckPasswordSRP\"}],\"type\":\"Updates\"},{\"id\":1491484525,\"method\":\"channels.editLocation\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"geo_point\",\"type\":\"InputGeoPoint\"},{\"name\":\"address\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":-304832784,\"method\":\"channels.toggleSlowMode\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"seconds\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":300429806,\"method\":\"channels.getInactiveChannels\",\"params\":[],\"type\":\"messages.InactiveChats\"},{\"id\":187239529,\"method\":\"channels.convertToGigagroup\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"}],\"type\":\"Updates\"},{\"id\":-1095836780,\"method\":\"channels.viewSponsoredMessage\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"random_id\",\"type\":\"bytes\"}],\"type\":\"Bool\"},{\"id\":-333377601,\"method\":\"channels.getSponsoredMessages\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"}],\"type\":\"messages.SponsoredMessages\"},{\"id\":231174382,\"method\":\"channels.getSendAs\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"channels.SendAsPeers\"},{\"id\":913655003,\"method\":\"channels.deleteParticipantHistory\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"participant\",\"type\":\"InputPeer\"}],\"type\":\"messages.AffectedHistory\"},{\"id\":-1440257555,\"method\":\"bots.sendCustomRequest\",\"params\":[{\"name\":\"custom_method\",\"type\":\"string\"},{\"name\":\"params\",\"type\":\"DataJSON\"}],\"type\":\"DataJSON\"},{\"id\":-434028723,\"method\":\"bots.answerWebhookJSONQuery\",\"params\":[{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"data\",\"type\":\"DataJSON\"}],\"type\":\"Bool\"},{\"id\":85399130,\"method\":\"bots.setBotCommands\",\"params\":[{\"name\":\"scope\",\"type\":\"BotCommandScope\"},{\"name\":\"lang_code\",\"type\":\"string\"},{\"name\":\"commands\",\"type\":\"Vector<BotCommand>\"}],\"type\":\"Bool\"},{\"id\":1032708345,\"method\":\"bots.resetBotCommands\",\"params\":[{\"name\":\"scope\",\"type\":\"BotCommandScope\"},{\"name\":\"lang_code\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":-481554986,\"method\":\"bots.getBotCommands\",\"params\":[{\"name\":\"scope\",\"type\":\"BotCommandScope\"},{\"name\":\"lang_code\",\"type\":\"string\"}],\"type\":\"Vector<BotCommand>\"},{\"id\":-1976353651,\"method\":\"payments.getPaymentForm\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"theme_params\",\"type\":\"flags.0?DataJSON\"}],\"type\":\"payments.PaymentForm\"},{\"id\":611897804,\"method\":\"payments.getPaymentReceipt\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"}],\"type\":\"payments.PaymentReceipt\"},{\"id\":-619695760,\"method\":\"payments.validateRequestedInfo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"save\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"info\",\"type\":\"PaymentRequestedInfo\"}],\"type\":\"payments.ValidatedRequestedInfo\"},{\"id\":818134173,\"method\":\"payments.sendPaymentForm\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"form_id\",\"type\":\"long\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"requested_info_id\",\"type\":\"flags.0?string\"},{\"name\":\"shipping_option_id\",\"type\":\"flags.1?string\"},{\"name\":\"credentials\",\"type\":\"InputPaymentCredentials\"},{\"name\":\"tip_amount\",\"type\":\"flags.2?long\"}],\"type\":\"payments.PaymentResult\"},{\"id\":578650699,\"method\":\"payments.getSavedInfo\",\"params\":[],\"type\":\"payments.SavedInfo\"},{\"id\":-667062079,\"method\":\"payments.clearSavedInfo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"credentials\",\"type\":\"flags.0?true\"},{\"name\":\"info\",\"type\":\"flags.1?true\"}],\"type\":\"Bool\"},{\"id\":779736953,\"method\":\"payments.getBankCardData\",\"params\":[{\"name\":\"number\",\"type\":\"string\"}],\"type\":\"payments.BankCardData\"},{\"id\":-1876841625,\"method\":\"stickers.createStickerSet\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"masks\",\"type\":\"flags.0?true\"},{\"name\":\"animated\",\"type\":\"flags.1?true\"},{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"short_name\",\"type\":\"string\"},{\"name\":\"thumb\",\"type\":\"flags.2?InputDocument\"},{\"name\":\"stickers\",\"type\":\"Vector<InputStickerSetItem>\"},{\"name\":\"software\",\"type\":\"flags.3?string\"}],\"type\":\"messages.StickerSet\"},{\"id\":-143257775,\"method\":\"stickers.removeStickerFromSet\",\"params\":[{\"name\":\"sticker\",\"type\":\"InputDocument\"}],\"type\":\"messages.StickerSet\"},{\"id\":-4795190,\"method\":\"stickers.changeStickerPosition\",\"params\":[{\"name\":\"sticker\",\"type\":\"InputDocument\"},{\"name\":\"position\",\"type\":\"int\"}],\"type\":\"messages.StickerSet\"},{\"id\":-2041315650,\"method\":\"stickers.addStickerToSet\",\"params\":[{\"name\":\"stickerset\",\"type\":\"InputStickerSet\"},{\"name\":\"sticker\",\"type\":\"InputStickerSetItem\"}],\"type\":\"messages.StickerSet\"},{\"id\":-1707717072,\"method\":\"stickers.setStickerSetThumb\",\"params\":[{\"name\":\"stickerset\",\"type\":\"InputStickerSet\"},{\"name\":\"thumb\",\"type\":\"InputDocument\"}],\"type\":\"messages.StickerSet\"},{\"id\":676017721,\"method\":\"stickers.checkShortName\",\"params\":[{\"name\":\"short_name\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":1303364867,\"method\":\"stickers.suggestShortName\",\"params\":[{\"name\":\"title\",\"type\":\"string\"}],\"type\":\"stickers.SuggestedShortName\"},{\"id\":1430593449,\"method\":\"phone.getCallConfig\",\"params\":[],\"type\":\"DataJSON\"},{\"id\":1124046573,\"method\":\"phone.requestCall\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"video\",\"type\":\"flags.0?true\"},{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"random_id\",\"type\":\"int\"},{\"name\":\"g_a_hash\",\"type\":\"bytes\"},{\"name\":\"protocol\",\"type\":\"PhoneCallProtocol\"}],\"type\":\"phone.PhoneCall\"},{\"id\":1003664544,\"method\":\"phone.acceptCall\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPhoneCall\"},{\"name\":\"g_b\",\"type\":\"bytes\"},{\"name\":\"protocol\",\"type\":\"PhoneCallProtocol\"}],\"type\":\"phone.PhoneCall\"},{\"id\":788404002,\"method\":\"phone.confirmCall\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPhoneCall\"},{\"name\":\"g_a\",\"type\":\"bytes\"},{\"name\":\"key_fingerprint\",\"type\":\"long\"},{\"name\":\"protocol\",\"type\":\"PhoneCallProtocol\"}],\"type\":\"phone.PhoneCall\"},{\"id\":399855457,\"method\":\"phone.receivedCall\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPhoneCall\"}],\"type\":\"Bool\"},{\"id\":-1295269440,\"method\":\"phone.discardCall\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"video\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"InputPhoneCall\"},{\"name\":\"duration\",\"type\":\"int\"},{\"name\":\"reason\",\"type\":\"PhoneCallDiscardReason\"},{\"name\":\"connection_id\",\"type\":\"long\"}],\"type\":\"Updates\"},{\"id\":1508562471,\"method\":\"phone.setCallRating\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"user_initiative\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"InputPhoneCall\"},{\"name\":\"rating\",\"type\":\"int\"},{\"name\":\"comment\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":662363518,\"method\":\"phone.saveCallDebug\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPhoneCall\"},{\"name\":\"debug\",\"type\":\"DataJSON\"}],\"type\":\"Bool\"},{\"id\":-8744061,\"method\":\"phone.sendSignalingData\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPhoneCall\"},{\"name\":\"data\",\"type\":\"bytes\"}],\"type\":\"Bool\"},{\"id\":1221445336,\"method\":\"phone.createGroupCall\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"random_id\",\"type\":\"int\"},{\"name\":\"title\",\"type\":\"flags.0?string\"},{\"name\":\"schedule_date\",\"type\":\"flags.1?int\"}],\"type\":\"Updates\"},{\"id\":-1322057861,\"method\":\"phone.joinGroupCall\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"muted\",\"type\":\"flags.0?true\"},{\"name\":\"video_stopped\",\"type\":\"flags.2?true\"},{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"join_as\",\"type\":\"InputPeer\"},{\"name\":\"invite_hash\",\"type\":\"flags.1?string\"},{\"name\":\"params\",\"type\":\"DataJSON\"}],\"type\":\"Updates\"},{\"id\":1342404601,\"method\":\"phone.leaveGroupCall\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"source\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":2067345760,\"method\":\"phone.inviteToGroupCall\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"users\",\"type\":\"Vector<InputUser>\"}],\"type\":\"Updates\"},{\"id\":2054648117,\"method\":\"phone.discardGroupCall\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"}],\"type\":\"Updates\"},{\"id\":1958458429,\"method\":\"phone.toggleGroupCallSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"reset_invite_hash\",\"type\":\"flags.1?true\"},{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"join_muted\",\"type\":\"flags.0?Bool\"}],\"type\":\"Updates\"},{\"id\":68699611,\"method\":\"phone.getGroupCall\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"phone.GroupCall\"},{\"id\":-984033109,\"method\":\"phone.getGroupParticipants\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"ids\",\"type\":\"Vector<InputPeer>\"},{\"name\":\"sources\",\"type\":\"Vector<int>\"},{\"name\":\"offset\",\"type\":\"string\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"phone.GroupParticipants\"},{\"id\":-1248003721,\"method\":\"phone.checkGroupCall\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"sources\",\"type\":\"Vector<int>\"}],\"type\":\"Vector<int>\"},{\"id\":-248985848,\"method\":\"phone.toggleGroupCallRecord\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"start\",\"type\":\"flags.0?true\"},{\"name\":\"video\",\"type\":\"flags.2?true\"},{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"title\",\"type\":\"flags.1?string\"},{\"name\":\"video_portrait\",\"type\":\"flags.2?Bool\"}],\"type\":\"Updates\"},{\"id\":-1524155713,\"method\":\"phone.editGroupCallParticipant\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"participant\",\"type\":\"InputPeer\"},{\"name\":\"muted\",\"type\":\"flags.0?Bool\"},{\"name\":\"volume\",\"type\":\"flags.1?int\"},{\"name\":\"raise_hand\",\"type\":\"flags.2?Bool\"},{\"name\":\"video_stopped\",\"type\":\"flags.3?Bool\"},{\"name\":\"video_paused\",\"type\":\"flags.4?Bool\"},{\"name\":\"presentation_paused\",\"type\":\"flags.5?Bool\"}],\"type\":\"Updates\"},{\"id\":480685066,\"method\":\"phone.editGroupCallTitle\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"title\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":-277077702,\"method\":\"phone.getGroupCallJoinAs\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"phone.JoinAsPeers\"},{\"id\":-425040769,\"method\":\"phone.exportGroupCallInvite\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"can_self_unmute\",\"type\":\"flags.0?true\"},{\"name\":\"call\",\"type\":\"InputGroupCall\"}],\"type\":\"phone.ExportedGroupCallInvite\"},{\"id\":563885286,\"method\":\"phone.toggleGroupCallStartSubscription\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"subscribed\",\"type\":\"Bool\"}],\"type\":\"Updates\"},{\"id\":1451287362,\"method\":\"phone.startScheduledGroupCall\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"}],\"type\":\"Updates\"},{\"id\":1465786252,\"method\":\"phone.saveDefaultGroupCallJoinAs\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"join_as\",\"type\":\"InputPeer\"}],\"type\":\"Bool\"},{\"id\":-873829436,\"method\":\"phone.joinGroupCallPresentation\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"params\",\"type\":\"DataJSON\"}],\"type\":\"Updates\"},{\"id\":475058500,\"method\":\"phone.leaveGroupCallPresentation\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"}],\"type\":\"Updates\"},{\"id\":-219008246,\"method\":\"langpack.getLangPack\",\"params\":[{\"name\":\"lang_pack\",\"type\":\"string\"},{\"name\":\"lang_code\",\"type\":\"string\"}],\"type\":\"LangPackDifference\"},{\"id\":-269862909,\"method\":\"langpack.getStrings\",\"params\":[{\"name\":\"lang_pack\",\"type\":\"string\"},{\"name\":\"lang_code\",\"type\":\"string\"},{\"name\":\"keys\",\"type\":\"Vector<string>\"}],\"type\":\"Vector<LangPackString>\"},{\"id\":-845657435,\"method\":\"langpack.getDifference\",\"params\":[{\"name\":\"lang_pack\",\"type\":\"string\"},{\"name\":\"lang_code\",\"type\":\"string\"},{\"name\":\"from_version\",\"type\":\"int\"}],\"type\":\"LangPackDifference\"},{\"id\":1120311183,\"method\":\"langpack.getLanguages\",\"params\":[{\"name\":\"lang_pack\",\"type\":\"string\"}],\"type\":\"Vector<LangPackLanguage>\"},{\"id\":1784243458,\"method\":\"langpack.getLanguage\",\"params\":[{\"name\":\"lang_pack\",\"type\":\"string\"},{\"name\":\"lang_code\",\"type\":\"string\"}],\"type\":\"LangPackLanguage\"},{\"id\":1749536939,\"method\":\"folders.editPeerFolders\",\"params\":[{\"name\":\"folder_peers\",\"type\":\"Vector<InputFolderPeer>\"}],\"type\":\"Updates\"},{\"id\":472471681,\"method\":\"folders.deleteFolder\",\"params\":[{\"name\":\"folder_id\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":-1421720550,\"method\":\"stats.getBroadcastStats\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"dark\",\"type\":\"flags.0?true\"},{\"name\":\"channel\",\"type\":\"InputChannel\"}],\"type\":\"stats.BroadcastStats\"},{\"id\":1646092192,\"method\":\"stats.loadAsyncGraph\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"token\",\"type\":\"string\"},{\"name\":\"x\",\"type\":\"flags.0?long\"}],\"type\":\"StatsGraph\"},{\"id\":-589330937,\"method\":\"stats.getMegagroupStats\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"dark\",\"type\":\"flags.0?true\"},{\"name\":\"channel\",\"type\":\"InputChannel\"}],\"type\":\"stats.MegagroupStats\"},{\"id\":1445996571,\"method\":\"stats.getMessagePublicForwards\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"offset_rate\",\"type\":\"int\"},{\"name\":\"offset_peer\",\"type\":\"InputPeer\"},{\"name\":\"offset_id\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"messages.Messages\"},{\"id\":-1226791947,\"method\":\"stats.getMessageStats\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"dark\",\"type\":\"flags.0?true\"},{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"msg_id\",\"type\":\"int\"}],\"type\":\"stats.MessageStats\"}]},\"layer\":137} as {\r\n MTProto: {\r\n constructors: MTProtoConstructor[],\r\n methods: MTProtoMethod[],\r\n constructorsIndex?: {[id: number]: number}\r\n },\r\n API: {\r\n constructors: MTProtoConstructor[],\r\n methods: MTProtoMethod[],\r\n constructorsIndex?: {[id: number]: number}\r\n },\r\n layer: number,\r\n};","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov <igor.beatle@gmail.com>\n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\n//import sha1 from '@cryptography/sha1';\n//import sha256 from '@cryptography/sha256';\nimport {IGE} from '@cryptography/aes';\n\n// @ts-ignore\nimport pako from 'pako/dist/pako_inflate.min.js';\n\nimport {str2bigInt, bpe, equalsInt, greater, \n copy_, eGCD_, add_, rightShift_, sub_, copyInt_, isZero,\n divide_, one, bigInt2str, powMod, bigInt2bytes, int2bigInt, mod} from '../../vendor/leemon';//from 'leemon';\n\nimport { addPadding } from '../mtproto/bin_utils';\nimport { bytesToWordss, bytesFromWordss, bytesToHex, bytesFromHex, convertToUint8Array } from '../../helpers/bytes';\nimport { nextRandomUint } from '../../helpers/random';\nimport type { RSAPublicKeyHex } from '../mtproto/rsaKeysManager';\n\nconst subtle = typeof(window) !== 'undefined' && 'crypto' in window ? window.crypto.subtle : self.crypto.subtle;\n\nexport function longToBytes(sLong: string) {\n /* let perf = performance.now();\n for(let i = 0; i < 1000000; ++i) {\n bytesFromWords({words: longToInts(sLong), sigBytes: 8}).reverse();\n }\n console.log('longToBytes JSBN', sLong, performance.now() - perf);\n \n //const bytes = bytesFromWords({words: longToInts(sLong), sigBytes: 8}).reverse();\n \n perf = performance.now();\n for(let i = 0; i < 1000000; ++i) {\n bigInt2bytes(str2bigInt(sLong, 10));\n }\n console.log('longToBytes LEEMON', sLong, performance.now() - perf); */\n\n const bigIntBytes = new Uint8Array(bigInt2bytes(str2bigInt(sLong, 10), false));\n const bytes = addPadding(bigIntBytes, 8, true, false, false);\n //console.log('longToBytes', bytes, b);\n \n return bytes;\n}\n\nexport function sha1HashSync(bytes: Parameters<typeof convertToUint8Array>[0]) {\n return subtle.digest('SHA-1', convertToUint8Array(bytes)).then(b => {\n return new Uint8Array(b);\n });\n /* //console.trace(dT(), 'SHA-1 hash start', bytes);\n\n const hashBytes: number[] = [];\n\n let hash = sha1(String.fromCharCode.apply(null, \n bytes instanceof Uint8Array ? [...bytes] : [...new Uint8Array(bytes)]));\n for(let i = 0; i < hash.length; ++i) {\n hashBytes.push(hash.charCodeAt(i));\n }\n\n //console.log(dT(), 'SHA-1 hash finish', hashBytes, bytesToHex(hashBytes));\n\n return new Uint8Array(hashBytes); */\n}\n\nexport function sha256HashSync(bytes: Parameters<typeof convertToUint8Array>[0]) {\n return subtle.digest('SHA-256', convertToUint8Array(bytes)).then(b => {\n //console.log('legacy', performance.now() - perfS);\n return new Uint8Array(b);\n });\n /* //console.log('SHA-256 hash start');\n\n let perfS = performance.now();\n \n\n let perfD = performance.now();\n let words = typeof(bytes) === 'string' ? bytes : bytesToWordss(bytes as any);\n let hash = sha256(words);\n console.log('darutkin', performance.now() - perfD);\n\n //console.log('SHA-256 hash finish', hash, sha256(words, 'hex'));\n\n return bytesFromWordss(hash); */\n}\n\nexport function aesEncryptSync(bytes: Uint8Array, keyBytes: Uint8Array, ivBytes: Uint8Array) {\n //console.log(dT(), 'AES encrypt start', bytes, keyBytes, ivBytes);\n // console.log('aes before padding bytes:', bytesToHex(bytes));\n bytes = addPadding(bytes);\n // console.log('aes after padding bytes:', bytesToHex(bytes));\n\n const cipher = new IGE(bytesToWordss(keyBytes), bytesToWordss(ivBytes));\n const encryptedBytes = cipher.encrypt(bytesToWordss(bytes));\n //console.log(dT(), 'AES encrypt finish');\n\n return bytesFromWordss(encryptedBytes);\n}\n\nexport function aesDecryptSync(bytes: Uint8Array, keyBytes: Uint8Array, ivBytes: Uint8Array) {\n //console.log(dT(), 'AES decrypt start', bytes, keyBytes, ivBytes);\n\n const cipher = new IGE(bytesToWordss(keyBytes), bytesToWordss(ivBytes));\n const decryptedBytes = cipher.decrypt(bytesToWordss(bytes));\n\n //console.log(dT(), 'AES decrypt finish');\n\n return bytesFromWordss(decryptedBytes);\n}\n\nexport function rsaEncrypt(bytes: Uint8Array, publicKey: RSAPublicKeyHex) {\n //console.log(dT(), 'RSA encrypt start', publicKey, bytes);\n\n const N = str2bigInt(publicKey.modulus, 16);\n const E = str2bigInt(publicKey.exponent, 16);\n const X = str2bigInt(bytesToHex(bytes), 16);\n\n const encryptedBigInt = powMod(X, E, N);\n const encryptedBytes = bytesFromHex(bigInt2str(encryptedBigInt, 16));\n\n //console.log(dT(), 'RSA encrypt finish');\n\n return encryptedBytes;\n}\n\nexport async function hash_pbkdf2(buffer: Parameters<SubtleCrypto['importKey']>[1], salt: HkdfParams['salt'], iterations: number) {\n const importKey = await subtle.importKey(\n 'raw',\n buffer,\n {name: 'PBKDF2'},\n false,\n [/* 'deriveKey', */'deriveBits']\n );\n \n /* await subtle.deriveKey(\n {\n name: 'PBKDF2',\n salt,\n iterations,\n hash: {name: 'SHA-512'}\n },\n importKey,\n {\n name: 'AES-CTR',\n length: 256\n },\n false,\n ['encrypt', 'decrypt']\n ); */\n\n let bits = subtle.deriveBits({\n name: 'PBKDF2',\n salt,\n iterations,\n hash: {name: 'SHA-512'},\n },\n importKey,\n 512\n );\n\n return bits.then(buffer => new Uint8Array(buffer));\n}\n\nexport function pqPrimeFactorization(pqBytes: Uint8Array | number[]) {\n let result: ReturnType<typeof pqPrimeLeemon>;\n\n //console.log('PQ start', pqBytes, bytesToHex(pqBytes));\n\n try {\n //console.time('PQ leemon');\n result = pqPrimeLeemon(str2bigInt(bytesToHex(pqBytes), 16, Math.ceil(64 / bpe) + 1));\n //console.timeEnd('PQ leemon');\n } catch(e) {\n console.error('Pq leemon Exception', e);\n }\n\n //console.log('PQ finish', result);\n\n return result;\n}\n\nexport function pqPrimeLeemon(what: number[]): [Uint8Array, Uint8Array, number] {\n var minBits = 64;\n var minLen = Math.ceil(minBits / bpe) + 1;\n var it = 0;\n var i, q;\n var j, lim;\n var P;\n var Q;\n var a = new Array(minLen);\n var b = new Array(minLen);\n var c = new Array(minLen);\n var g = new Array(minLen);\n var z = new Array(minLen);\n var x = new Array(minLen);\n var y = new Array(minLen);\n\n for(i = 0; i < 3; ++i) {\n q = (nextRandomUint(8) & 15) + 17;\n copy_(x, mod(int2bigInt(nextRandomUint(32), 32, 0), what));\n copy_(y, x);\n lim = 1 << (i + 18);\n\n for (j = 1; j < lim; ++j) {\n ++it;\n copy_(a, x);\n copy_(b, x);\n copyInt_(c, q);\n\n while(!isZero(b)) {\n if(b[0] & 1) {\n add_(c, a);\n if(greater(c, what)) {\n sub_(c, what);\n }\n }\n add_(a, a);\n if(greater(a, what)) {\n sub_(a, what);\n }\n rightShift_(b, 1);\n }\n\n copy_(x, c);\n if(greater(x, y)) {\n copy_(z, x);\n sub_(z, y);\n } else {\n copy_(z, y);\n sub_(z, x);\n }\n eGCD_(z, what, g, a, b);\n if(!equalsInt(g, 1)) {\n break;\n }\n if((j & (j - 1)) === 0) {\n copy_(y, x);\n }\n }\n if(greater(g, one)) {\n break;\n }\n }\n\n divide_(what, g, x, y);\n\n if(greater(g, x)) {\n P = x;\n Q = g;\n } else {\n P = g;\n Q = x;\n }\n\n // console.log(dT(), 'done', bigInt2str(what, 10), bigInt2str(P, 10), bigInt2str(Q, 10))\n\n return [new Uint8Array(bigInt2bytes(P)), new Uint8Array(bigInt2bytes(Q)), it];\n}\n\nexport function bytesModPow(x: number[] | Uint8Array, y: number[] | Uint8Array, m: number[] | Uint8Array) {\n try {\n const xBigInt = str2bigInt(bytesToHex(x), 16);\n const yBigInt = str2bigInt(bytesToHex(y), 16);\n const mBigInt = str2bigInt(bytesToHex(m), 16);\n const resBigInt = powMod(xBigInt, yBigInt, mBigInt);\n\n return bytesFromHex(bigInt2str(resBigInt, 16));\n } catch(e) {\n console.error('mod pow error', e);\n }\n\n //return bytesFromBigInt(new BigInteger(x).modPow(new BigInteger(y), new BigInteger(m)), 256);\n}\n\n//export function gzipUncompress(bytes: ArrayBuffer, toString: true): string;\n//export function gzipUncompress(bytes: ArrayBuffer, toString?: false): Uint8Array;\nexport function gzipUncompress(bytes: ArrayBuffer, toString?: boolean): string | Uint8Array {\n //console.log(dT(), 'Gzip uncompress start');\n const result = pako.inflate(bytes, toString ? {to: 'string'} : undefined);\n //console.log(dT(), 'Gzip uncompress finish'/* , result */);\n return result;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov <igor.beatle@gmail.com>\n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport { bytesFromHex, bytesToHex } from '../../helpers/bytes';\nimport { addPadding, isObject, longFromInts } from './bin_utils';\nimport { MOUNT_CLASS_TO } from '../../config/debug';\nimport { str2bigInt, bigInt2str, int2bigInt, sub_ } from '../../vendor/leemon';\nimport Schema, { MTProtoConstructor } from './schema';\nimport { JSONValue } from '../../layer';\n\n \n// @ts-ignore\nimport { gzipUncompress } from '../crypto/crypto_utils';\n \n\n// @ts-ignore\n/* import {BigInteger} from 'jsbn';\n\nexport function bigint(num: number) {\n return new BigInteger(num.toString(16), 16);\n}\n\nfunction bigStringInt(strNum: string) {\n return new BigInteger(strNum, 10)\n} */\n\nconst boolFalse = +Schema.API.constructors.find(c => c.predicate === 'boolFalse').id;\nconst boolTrue = +Schema.API.constructors.find(c => c.predicate === 'boolTrue').id;\nconst vector = +Schema.API.constructors.find(c => c.predicate === 'vector').id;\nconst gzipPacked = +Schema.MTProto.constructors.find(c => c.predicate === 'gzip_packed').id;\n\n//console.log('boolFalse', boolFalse === 0xbc799737);\n\nclass TLSerialization {\n private maxLength = 2048; // 2Kb\n private offset = 0; // in bytes\n private mtproto = false;\n private debug = false;//Modes.debug;\n\n private buffer: ArrayBuffer;\n private intView: Int32Array;\n private byteView: Uint8Array;\n\n constructor(options: Partial<{startMaxLength: number, mtproto: true}> = {}) {\n this.maxLength = options.startMaxLength || 2048; // 2Kb\n this.mtproto = options.mtproto || false;\n this.createBuffer();\n }\n\n public createBuffer() {\n this.buffer = new ArrayBuffer(this.maxLength);\n this.intView = new Int32Array(this.buffer);\n this.byteView = new Uint8Array(this.buffer);\n }\n\n public getArray() {\n const resultBuffer = new ArrayBuffer(this.offset);\n\n //let perf = performance.now();\n /* const resultUint8: any = new Uint8Array(resultBuffer);\n resultUint8.set(this.byteView.subarray(0, this.offset)); */\n //console.log('perf uint8', performance.now() - perf);\n\n //perf = performance.now();\n const resultInt32 = new Int32Array(resultBuffer);\n resultInt32.set(this.intView.subarray(0, this.offset / 4));\n //console.log('perf int32', performance.now() - perf);\n\n /* if(resultUint8.buffer.byteLength !== resultInt32.buffer.byteLength) {\n console.error(resultUint8, resultInt32);\n } */\n \n return resultInt32;\n }\n\n public getBuffer() {\n return this.getArray().buffer;\n }\n\n public getBytes(typed: true): Uint8Array;\n public getBytes(typed?: false): number[];\n public getBytes(typed: boolean = true): number[] | Uint8Array {\n if(typed) {\n const resultBuffer = new ArrayBuffer(this.offset);\n const resultArray = new Uint8Array(resultBuffer);\n \n resultArray.set(this.byteView.subarray(0, this.offset));\n \n return resultArray;\n }\n \n const bytes: number[] = new Array(this.offset);\n for(let i = 0; i < this.offset; i++) {\n bytes[i] = this.byteView[i];\n }\n return bytes;\n }\n\n public getOffset() {\n return this.offset;\n }\n\n public checkLength(needBytes: number) {\n if(this.offset + needBytes < this.maxLength) {\n return;\n }\n \n //console.log('Increase buffer start', this.offset, needBytes, this.maxLength, this.byteView.slice(0, 32));\n this.maxLength = Math.ceil(Math.max(this.maxLength * 2, this.offset + needBytes + 16) / 4) * 4;\n const previousBuffer = this.buffer;\n //const previousByteView = this.byteView;\n const previousArray = new Int32Array(previousBuffer);\n \n this.createBuffer();\n \n new Int32Array(this.buffer).set(previousArray);\n /* console.log('Increase buffer end', this.offset, needBytes, this.maxLength, this.byteView.slice(0, 32), \n bytesCmp(previousByteView, this.byteView.slice(0, previousByteView.length))); */\n }\n\n public writeInt(i: number, field: string) {\n this.debug && console.log('>>>', i.toString(16), i, field);\n \n const offset = this.offset / 4;\n this.checkLength(4);\n this.intView[offset] = i;\n this.offset += 4;\n\n return offset;\n }\n \n public storeInt(i: number, field?: string) {\n return this.writeInt(i, (field || '') + ':int');\n }\n \n public storeBool(i: boolean, field?: string) {\n if(i) {\n this.writeInt(boolTrue, (field || '') + ':bool');\n } else {\n this.writeInt(boolFalse, (field || '') + ':bool');\n }\n }\n \n public storeLongP(iHigh: number, iLow: number, field?: string) {\n this.writeInt(iLow, (field || '') + ':long[low]');\n this.writeInt(iHigh, (field || '') + ':long[high]');\n }\n\n public storeLong(sLong: Array<number> | string | number, field?: string) {\n if(Array.isArray(sLong)) {\n if(sLong.length === 2) {\n return this.storeLongP(sLong[0], sLong[1], field);\n } else {\n return this.storeIntBytes(sLong, 64, field);\n }\n }\n \n if(typeof sLong !== 'string') {\n sLong = sLong ? sLong.toString() : '0';\n }\n\n /* let perf = performance.now();\n const jsbnBytes: Uint8Array = new Uint8Array(8);\n const jsbnBigInt = bigStringInt(sLong);\n for(let i = 0; i < 8; i++) {\n jsbnBytes[i] = +jsbnBigInt.shiftRight(8 * i).and(bigint(255)).toString(10);\n }\n console.log('perf1', performance.now() - perf); */\n\n // perf = performance.now();\n let bigInt: number[];\n if(sLong[0] === '-') { // leemon library can't parse signed numbers\n bigInt = int2bigInt(0, 64, 8);\n sub_(bigInt, str2bigInt(sLong.slice(1), 10, 64));\n } else {\n bigInt = str2bigInt(sLong, 10, 64);\n }\n\n const hex = bigInt2str(bigInt, 16).slice(-16);\n const bytes = addPadding(bytesFromHex(hex).reverse(), 8, true, true, false);\n\n // console.log('perf2', performance.now() - perf);\n\n this.storeRawBytes(bytes);\n\n // if(jsbnBytes.hex !== bytes.hex) {\n // console.error(bigInt, sLong, bigInt2str(bigInt, 10), negative(bigInt), jsbnBytes.hex, bigInt2str(bigInt, 16), bytes.hex);\n // }\n }\n \n public storeDouble(f: any, field?: string) {\n const buffer = new ArrayBuffer(8);\n const intView = new Int32Array(buffer);\n const doubleView = new Float64Array(buffer);\n \n doubleView[0] = f;\n \n this.writeInt(intView[0], (field || '') + ':double[low]');\n this.writeInt(intView[1], (field || '') + ':double[high]');\n }\n \n public storeString(s: string, field?: string) {\n this.debug && console.log('>>>', s, (field || '') + ':string');\n \n if(s === undefined) {\n s = '';\n }\n const sUTF8 = unescape(encodeURIComponent(s));\n \n this.checkLength(sUTF8.length + 8);\n \n const len = sUTF8.length;\n if(len <= 253) {\n this.byteView[this.offset++] = len;\n } else {\n this.byteView[this.offset++] = 254;\n this.byteView[this.offset++] = len & 0xFF;\n this.byteView[this.offset++] = (len & 0xFF00) >> 8;\n this.byteView[this.offset++] = (len & 0xFF0000) >> 16;\n }\n for(let i = 0; i < len; i++) {\n this.byteView[this.offset++] = sUTF8.charCodeAt(i);\n }\n \n // Padding\n while(this.offset % 4) {\n this.byteView[this.offset++] = 0;\n }\n }\n \n public storeBytes(bytes: ArrayBuffer | Uint8Array | number[], field?: string) {\n if(bytes instanceof ArrayBuffer) {\n bytes = new Uint8Array(bytes);\n } else if(bytes === undefined) {\n bytes = [];\n }\n\n this.debug && console.log('>>>', bytesToHex(bytes as number[]), (field || '') + ':bytes');\n \n // if uint8array was json.stringified, then will be: {'0': 123, '1': 123}\n const len = (bytes as Uint8Array).length;\n this.checkLength(len + 8);\n if(len <= 253) {\n this.byteView[this.offset++] = len;\n } else {\n this.byteView[this.offset++] = 254;\n this.byteView[this.offset++] = len & 0xFF;\n this.byteView[this.offset++] = (len & 0xFF00) >> 8;\n this.byteView[this.offset++] = (len & 0xFF0000) >> 16;\n }\n \n this.byteView.set(bytes as Uint8Array, this.offset);\n this.offset += len;\n \n // Padding\n while(this.offset % 4) {\n this.byteView[this.offset++] = 0;\n }\n }\n \n public storeIntBytes(bytes: ArrayBuffer | Uint8Array | number[], bits: number, field?: string) {\n if(bytes instanceof ArrayBuffer) {\n bytes = new Uint8Array(bytes);\n }\n\n const len = (bytes as Uint8Array).length;\n if((bits % 32) || (len * 8) !== bits) {\n const error = new Error('Invalid bits: ' + bits + ', ' + len);\n console.error(error, bytes, field);\n throw error;\n }\n \n this.debug && console.log('>>>', bytesToHex(bytes as Uint8Array), (field || '') + ':int' + bits);\n this.checkLength(len);\n \n this.byteView.set(bytes as Uint8Array, this.offset);\n this.offset += len;\n }\n \n public storeRawBytes(bytes: ArrayLike<number>, field?: string) {\n if(bytes instanceof ArrayBuffer) {\n bytes = new Uint8Array(bytes);\n }\n\n const len = bytes.length;\n \n this.debug && console.log('>>>', bytesToHex(bytes), (field || ''));\n this.checkLength(len);\n \n this.byteView.set(bytes, this.offset);\n this.offset += len;\n }\n \n public storeMethod(methodName: string, params: any) {\n const schema = this.mtproto ? Schema.MTProto : Schema.API;\n const methodData = schema.methods.find(m => m.method === methodName);\n\n if(!methodData) {\n throw new Error('No method ' + methodName + ' found');\n }\n \n this.storeInt(methodData.id, methodName + '[id]');\n\n const pFlags = params.pFlags || params; // * support pFlags, though am not expecting it to be there\n const flagsOffsets: {[paramName: string]: number} = {};\n //console.log('storeMethod', len, methodData);\n for(const param of methodData.params) {\n let type = param.type;\n\n if(type.indexOf('?') !== -1) {\n const condType = type.split('?');\n const fieldBit = condType[0].split('.');\n\n if(!(params[fieldBit[0]] & (1 << +fieldBit[1]))) {\n if(condType[1] === 'true' ? pFlags[param.name] : params[param.name] !== undefined) {\n //console.log('storeMethod autocompleting', methodName, param.name, params[param.name], type);\n params[fieldBit[0]] |= 1 << +fieldBit[1];\n } else {\n continue;\n }\n }\n \n //console.log('storeMethod', methodName, fieldBit, params[fieldBit[0]], params, param, condType, !!(params[fieldBit[0]] & (1 << +fieldBit[1])));\n type = condType[1];\n }\n \n //console.log('storeMethod', methodName, param.name, params[param.name], type);\n const result = this.storeObject(params[param.name], type, methodName + '[' + param.name + ']');\n\n if(type === '#') {\n params[param.name] = params[param.name] || 0;\n flagsOffsets[param.name] = result as number;\n }\n }\n\n for(let paramName in flagsOffsets) {\n this.intView[flagsOffsets[paramName]] = params[paramName];\n }\n\n return methodData.type;\n }\n \n public storeObject(obj: any, type: string, field?: string) {\n //console.log('storeObject', obj, type, field, this.offset, this.getBytes(true).hex);\n switch(type) {\n case '#':\n obj = obj || 0;\n case 'int':\n return this.storeInt(obj, field);\n case 'long':\n return this.storeLong(obj, field);\n case 'int128':\n return this.storeIntBytes(obj, 128, field);\n case 'int256':\n return this.storeIntBytes(obj, 256, field);\n case 'int512':\n return this.storeIntBytes(obj, 512, field);\n case 'string':\n return this.storeString(obj, field);\n case 'bytes':\n return this.storeBytes(obj, field);\n case 'double':\n return this.storeDouble(obj, field);\n case 'Bool':\n return this.storeBool(obj, field);\n case 'true':\n return\n }\n \n if(Array.isArray(obj)) {\n if(type.substr(0, 6) === 'Vector') {\n this.writeInt(vector, field + '[id]');\n } else if (type.substr(0, 6) !== 'vector') {\n throw new Error('Invalid vector type ' + type);\n }\n\n const itemType = type.substr(7, type.length - 8); // for \"Vector<itemType>\"\n this.writeInt(obj.length, field + '[count]');\n for(let i = 0; i < obj.length; i++) {\n this.storeObject(obj[i], itemType, field + '[' + i + ']');\n }\n\n return true;\n } else if (type.substr(0, 6).toLowerCase() === 'vector') {\n throw new Error('Invalid vector object');\n }\n \n if(!isObject(obj)) {\n throw new Error('Invalid object for type ' + type);\n }\n \n const schema = this.mtproto ? Schema.MTProto : Schema.API;\n const predicate = obj['_'];\n let isBare = false;\n const constructorData: MTProtoConstructor = schema.constructors.find(c => c.predicate === predicate);\n \n if(isBare = (type.charAt(0) === '%')) {\n type = type.substr(1);\n }\n\n if(!constructorData) {\n throw new Error('No predicate ' + predicate + ' found');\n }\n \n if(predicate === type) {\n isBare = true;\n }\n \n if(!isBare) {\n this.writeInt(constructorData.id, field + '[' + predicate + '][id]');\n }\n\n const pFlags = obj.pFlags;\n const flagsOffsets: {[paramName: string]: number} = {};\n //console.log('storeObject', len, constructorData);\n for(const param of constructorData.params) {\n let type = param.type;\n\n //console.log('storeObject', param, type);\n if(type.indexOf('?') !== -1) {\n const condType = type.split('?');\n const fieldBit = condType[0].split('.');\n\n //console.log('storeObject fieldBit', fieldBit, obj[fieldBit[0]]);\n\n if(!(obj[fieldBit[0]] & (1 << +fieldBit[1]))) {\n if(condType[1] === 'true' ? pFlags && pFlags[param.name] : obj[param.name] !== undefined) {\n //console.log('storeObject autocompleting', param.name, obj[param.name], type);\n obj[fieldBit[0]] |= 1 << +fieldBit[1];\n } else {\n continue;\n }\n }\n\n type = condType[1];\n }\n //console.log('storeObject', param, type);\n \n const result = this.storeObject(obj[param.name], type, field + '[' + predicate + '][' + param.name + ']');\n\n if(type === '#') {\n obj[param.name] = obj[param.name] || 0;\n flagsOffsets[param.name] = result as number;\n }\n }\n\n for(let paramName in flagsOffsets) {\n this.intView[flagsOffsets[paramName]] = obj[paramName];\n }\n \n return constructorData.type;\n }\n}\n\nclass TLDeserialization<FetchLongAs extends Long> {\n private offset = 0; // in bytes\n private override: {[key: string]: (result: any, field: string) => void};\n\n private buffer: ArrayBuffer;\n private intView: Int32Array;\n private byteView: Uint8Array;\n\n // this.debug = \n private mtproto: boolean = false;\n private debug: boolean;\n\n constructor(buffer: ArrayBuffer | Uint8Array, options: Partial<{override: any, mtproto: true, debug: true}> = {}) {\n //buffer = addPadding(buffer, 4, true); // fix 21.01.2020 for wss\n if(buffer instanceof ArrayBuffer) {\n this.buffer = buffer;\n this.intView = new Int32Array(buffer);\n this.byteView = new Uint8Array(this.buffer);\n } else {\n this.buffer = buffer.buffer;\n this.intView = new Int32Array(buffer.buffer);\n this.byteView = buffer;\n }\n\n //console.log(this.intView);\n\n this.override = options.override || {};\n this.mtproto = !!options.mtproto;\n this.debug = options.debug !== undefined ? options.debug : /* Modes.debug */false;\n }\n\n private readInt(field: string) {\n //if(this.offset >= this.intView.length * 4) {\n if((this.byteView.length - this.offset) < 4) {\n console.error(this.byteView, this.offset);\n throw new Error('Nothing to fetch: ' + field);\n }\n \n const i = this.intView[this.offset / 4];\n // const i = new Uint32Array(this.byteView.buffer.slice(this.offset, this.offset + 4))[0];\n \n this.debug/* || field.includes('[dialog][read_outbox_max_id]') */ \n && console.log('<<<', i.toString(16), i, field, \n this.byteView.slice(this.offset - 16, this.offset + 16), \n this.byteView.slice(this.offset - 16, this.offset + 16).hex);\n \n this.offset += 4;\n \n return i;\n }\n \n public fetchInt(field?: string) {\n return this.readInt((field || '') + ':int');\n }\n \n public fetchDouble(field?: string) {\n const buffer = new ArrayBuffer(8);\n const intView = new Int32Array(buffer);\n const doubleView = new Float64Array(buffer);\n \n intView[0] = this.readInt((field || '') + ':double[low]'),\n intView[1] = this.readInt((field || '') + ':double[high]');\n \n return doubleView[0];\n }\n \n public fetchLong(field?: string): FetchLongAs {\n const iLow = this.readInt((field || '') + ':long[low]');\n const iHigh = this.readInt((field || '') + ':long[high]');\n \n //const longDec = bigint(iHigh).shiftLeft(32).add(bigint(iLow)).toString();\n const longDec = longFromInts(iHigh, iLow);\n\n if(!this.mtproto) {\n const num = +longDec;\n if(Number.isSafeInteger(num)) {\n // @ts-ignore\n return num;\n }\n }\n \n // @ts-ignore\n return longDec;\n }\n \n public fetchBool(field?: string): boolean {\n const i = this.readInt((field || '') + ':bool');\n if(i === boolTrue) {\n return true;\n } else if(i === boolFalse) {\n return false;\n }\n\n this.offset -= 4;\n return this.fetchObject('Object', field);\n }\n \n public fetchString(field?: string): string {\n let len = this.byteView[this.offset++];\n \n if(len === 254) {\n len = this.byteView[this.offset++] |\n (this.byteView[this.offset++] << 8) |\n (this.byteView[this.offset++] << 16);\n }\n \n let sUTF8 = '';\n for(let i = 0; i < len; i++) {\n sUTF8 += String.fromCharCode(this.byteView[this.offset++]);\n }\n \n // Padding\n while(this.offset % 4) {\n this.offset++;\n }\n \n let s: string;\n try {\n s = decodeURIComponent(escape(sUTF8));\n } catch (e) {\n s = sUTF8;\n }\n \n this.debug && console.log('<<<', s, (field || '') + ':string');\n \n return s;\n }\n \n public fetchBytes(field?: string) {\n let len = this.byteView[this.offset++];\n \n if(len === 254) {\n len = this.byteView[this.offset++] |\n (this.byteView[this.offset++] << 8) |\n (this.byteView[this.offset++] << 16);\n }\n \n const bytes = this.byteView.subarray(this.offset, this.offset + len);\n this.offset += len;\n \n // Padding\n while(this.offset % 4) {\n this.offset++;\n }\n \n this.debug && console.log('<<<', bytesToHex(bytes), (field || '') + ':bytes');\n \n return bytes;\n }\n \n public fetchIntBytes(bits: number, typed: true, field?: string): Uint8Array;\n public fetchIntBytes(bits: number, typed?: false, field?: string): number[];\n public fetchIntBytes(bits: number, typed: boolean = true, field?: string) {\n if(bits % 32) {\n throw new Error('Invalid bits: ' + bits);\n }\n \n const len = bits / 8;\n if(typed) {\n const result = this.byteView.subarray(this.offset, this.offset + len);\n this.offset += len;\n return result;\n }\n \n const bytes: number[] = new Array(len);\n for(let i = 0; i < len; i++) {\n bytes[i] = this.byteView[this.offset++];\n }\n \n this.debug && console.log('<<<', bytesToHex(bytes), (field || '') + ':int' + bits);\n \n return bytes;\n }\n \n public fetchRawBytes(len: number | false, typed: true, field: string): Uint8Array;\n public fetchRawBytes(len: number | false, typed: false, field: string): number[];\n public fetchRawBytes(len: number | false, typed: boolean = true, field: string) {\n if(len === false) {\n len = this.readInt((field || '') + '_length');\n if(len > this.byteView.byteLength) {\n throw new Error('Invalid raw bytes length: ' + len + ', buffer len: ' + this.byteView.byteLength);\n }\n }\n \n if(typed) {\n const bytes = new Uint8Array(len);\n bytes.set(this.byteView.subarray(this.offset, this.offset + len));\n this.offset += len;\n return bytes;\n }\n \n const bytes: number[] = new Array(len);\n for(let i = 0; i < len; i++) {\n bytes[i] = this.byteView[this.offset++];\n }\n \n this.debug && console.log('<<<', bytesToHex(bytes), (field || ''));\n \n return bytes;\n }\n\n private fetchVector(type: string, field?: string) {\n const len = this.readInt(field + '[count]');\n const result: any[] = new Array(len);\n if(len > 0) {\n const itemType = type.substr(7, type.length - 8); // for \"Vector<itemType>\"\n for(let i = 0; i < len; ++i) {\n result[i] = this.fetchObject(itemType, field + '[' + i + ']');\n }\n }\n \n return result;\n }\n \n public fetchObject(type: string, field?: string): any {\n switch(type) {\n case '#':\n case 'int':\n return this.fetchInt(field);\n case 'long':\n return this.fetchLong(field);\n case 'int128':\n return this.fetchIntBytes(128, true, field);\n case 'int256':\n return this.fetchIntBytes(256, true, field);\n case 'int512':\n return this.fetchIntBytes(512, true, field);\n case 'string':\n return this.fetchString(field);\n case 'bytes':\n return this.fetchBytes(field);\n case 'double':\n return this.fetchDouble(field);\n case 'Bool':\n return this.fetchBool(field);\n case 'true':\n return true;\n }\n \n field = field || type || 'Object';\n \n if(type.charAt(0) === 'v' && type.substr(1, 5) === 'ector') {\n return this.fetchVector(type, field);\n }\n \n const schema = this.mtproto ? Schema.MTProto : Schema.API;\n let constructorData: MTProtoConstructor = null;\n let fallback = false;\n \n if(type.charAt(0) === '%') {\n const checkType = type.substr(1);\n constructorData = schema.constructors.find(c => c.type === checkType);\n if(!constructorData) {\n throw new Error('Constructor not found for type: ' + type);\n }\n }/* else if(type.charAt(0) >= 97 && type.charAt(0) <= 122) {\n constructorData = schema.constructors.find(c => c.predicate === type);\n if(!constructorData) {\n throw new Error('Constructor not found for predicate: ' + type);\n }\n } */ else {\n const constructorCmp = this.readInt(field + '[id]');\n \n if(constructorCmp === gzipPacked) { // Gzip packed\n const compressed = this.fetchBytes(field + '[packed_string]');\n const uncompressed = gzipUncompress(compressed) as Uint8Array;\n const newDeserializer = new TLDeserialization(uncompressed); // rpc_result is packed here\n \n return newDeserializer.fetchObject(type, field);\n }\n\n if(constructorCmp === vector) {\n return this.fetchVector(type, field);\n }\n \n let index = schema.constructorsIndex;\n if(!index) {\n schema.constructorsIndex = index = {};\n for(let i = 0, len = schema.constructors.length; i < len; i++) {\n index[schema.constructors[i].id] = i;\n }\n }\n\n const i = index[constructorCmp];\n if(i !== undefined) {\n constructorData = schema.constructors[i];\n }\n \n if(!constructorData && this.mtproto) {\n const schemaFallback = Schema.API;\n for(let i = 0, len = schemaFallback.constructors.length; i < len; i++) {\n if(+schemaFallback.constructors[i].id === constructorCmp) {\n constructorData = schemaFallback.constructors[i];\n \n delete this.mtproto;\n fallback = true;\n break;\n }\n }\n }\n\n if(!constructorData) {\n console.error('Constructor not found:', constructorCmp);\n \n let int1: number, int2: number;\n try {\n int1 = this.fetchInt(field);\n int2 = this.fetchInt(field);\n } catch(err) {\n\n }\n\n throw new Error('Constructor not found: ' + constructorCmp + ' ' + int1 + ' ' + int2 + ' ' + field);\n }\n }\n \n const predicate = constructorData.predicate;\n \n const result: any = {'_': predicate};\n const overrideKey = (this.mtproto ? 'mt_' : '') + predicate;\n if(this.override[overrideKey]) {\n this.override[overrideKey](result, field + '[' + predicate + ']');\n } else {\n for(let i = 0, len = constructorData.params.length; i < len; i++) {\n const param = constructorData.params[i];\n let type = param.type;\n\n if(type === '#' && result.pFlags === undefined) {\n result.pFlags = {};\n }\n\n const isCond = (type.indexOf('?') !== -1);\n if(isCond) {\n const condType = type.split('?');\n const fieldBit = condType[0].split('.');\n\n if(!(result[fieldBit[0]] & (1 << +fieldBit[1]))) {\n //console.log('fetchObject bad', constructorData, result[fieldBit[0]], fieldBit);\n continue;\n }\n\n //console.log('fetchObject good', constructorData, result[fieldBit[0]], fieldBit);\n\n type = condType[1];\n }\n \n const value = this.fetchObject(type, field + '[' + predicate + '][' + param.name + ']');\n \n if(isCond && type === 'true') {\n result.pFlags[param.name] = value;\n } else {\n /* if(param.name === 'read_outbox_max_id') {\n console.log(result, param.name, value, field + '[' + predicate + '][' + param.name + ']');\n } */\n \n result[param.name] = value;\n }\n }\n }\n \n if(fallback) {\n this.mtproto = true;\n }\n\n if(type === 'JSONValue') {\n return this.formatJSONValue(result);\n }\n \n return result;\n }\n\n private formatJSONValue(jsonValue: JSONValue): any {\n if(!jsonValue._) return jsonValue;\n switch(jsonValue._) {\n case 'jsonNull':\n return null;\n case 'jsonObject': {\n const out: any = {};\n const objectValues = jsonValue.value;\n for(let i = 0, length = objectValues.length; i < length; ++i) {\n const objectValue = objectValues[i];\n out[objectValue.key] = this.formatJSONValue(objectValue.value);\n }\n return out;\n }\n default:\n return jsonValue.value;\n }\n }\n \n public getOffset() {\n return this.offset;\n }\n\n public setOffset(offset: number) {\n this.offset = offset;\n }\n \n /* public fetchEnd() {\n if(this.offset !== this.byteView.length) {\n throw new Error('Fetch end with non-empty buffer');\n }\n\n return true;\n } */\n}\n\nMOUNT_CLASS_TO.TLDeserialization = TLDeserialization;\nMOUNT_CLASS_TO.TLSerialization = TLSerialization;\nexport { TLDeserialization, TLSerialization };\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport CryptoWorker from \"../crypto/cryptoworker\";\r\nimport {str2bigInt, isZero,\r\n bigInt2str, powMod, int2bigInt, mult, mod, sub, bitSize, negative, add, greater} from '../../vendor/leemon';\r\n\r\nimport {logger, LogTypes} from '../logger';\r\nimport { AccountPassword, InputCheckPasswordSRP, PasswordKdfAlgo } from \"../../layer\";\r\nimport { bufferConcats, bytesToHex, bytesFromHex, bytesXor, convertToUint8Array } from \"../../helpers/bytes\";\r\nimport { addPadding } from \"../mtproto/bin_utils\";\r\n//import { MOUNT_CLASS_TO } from \"../../config/debug\";\r\n\r\nconst log = logger('SRP', LogTypes.Error);\r\n\r\n//MOUNT_CLASS_TO && Object.assign(MOUNT_CLASS_TO, {str2bigInt, bigInt2str, int2bigInt});\r\n\r\nexport async function makePasswordHash(password: string, client_salt: Uint8Array, server_salt: Uint8Array) {\r\n // ! look into crypto_methods.test.ts\r\n let buffer = await CryptoWorker.invokeCrypto('sha256-hash', bufferConcats(client_salt, new TextEncoder().encode(password), client_salt));\r\n //log('encoded 1', bytesToHex(new Uint8Array(buffer)));\r\n\r\n buffer = bufferConcats(server_salt, buffer, server_salt);\r\n\r\n buffer = await CryptoWorker.invokeCrypto('sha256-hash', buffer);\r\n //log('encoded 2', buffer, bytesToHex(new Uint8Array(buffer)));\r\n\r\n let hash = await CryptoWorker.invokeCrypto('pbkdf2', new Uint8Array(buffer), client_salt, 100000);\r\n //log('encoded 3', hash, bytesToHex(new Uint8Array(hash)));\r\n\r\n hash = bufferConcats(server_salt, hash, server_salt);\r\n\r\n buffer = await CryptoWorker.invokeCrypto('sha256-hash', hash);\r\n //log('got password hash:', buffer, bytesToHex(new Uint8Array(buffer)));\r\n\r\n return buffer;\r\n}\r\n\r\nexport async function computeSRP(password: string, state: AccountPassword, isNew: boolean) {\r\n const algo = (isNew ? state.new_algo : state.current_algo) as PasswordKdfAlgo.passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow;\r\n //console.log('computeSRP:', password, state, isNew, algo);\r\n\r\n const p = str2bigInt(bytesToHex(algo.p), 16);\r\n const g = int2bigInt(algo.g, 32, 256);\r\n \r\n //log('p', bigInt2str(p, 16));\r\n \r\n /* if(B.compareTo(BigInteger.ZERO) < 0) {\r\n console.error('srp_B < 0')\r\n }\r\n \r\n if(B.compareTo(p) <= 0) {\r\n console.error('srp_B <= p');\r\n } */\r\n \r\n /* let check_prime_and_good = (bytes: any, g: number) => {\r\n let good_prime = 'c71caeb9c6b1c9048e6c522f70f13f73980d40238e3e21c14934d037563d930f48198a0aa7c14058229493d22530f4dbfa336f6e0ac925139543aed44cce7c3720fd51f69458705ac68cd4fe6b6b13abdc9746512969328454f18faf8c595f642477fe96bb2a941d5bcd1d4ac8cc49880708fa9b378e3c4f3a9060bee67cf9a4a4a695811051907e162753b56b0f6b410dba74d8a84b2a14b3144e0ef1284754fd17ed950d5965b4b9dd46582db1178d169c6bc465b0d6ff9ca3928fef5b9ae4e418fc15e83ebea0f87fa9ff5eed70050ded2849f47bf959d956850ce929851f0d8115f635b105ee2e4e15d04b2454bf6f4fadf034b10403119cd8e3b92fcc5b';\r\n \r\n if(bytesToHex(bytes) === good_prime && [3, 4, 5, 7].indexOf(g) !== -1) {\r\n return true;\r\n }\r\n \r\n // TO-DO check_prime_and_good_check\r\n }; */\r\n \r\n //check_prime_and_good(algo.p, g);\r\n \r\n const pw_hash = await makePasswordHash(password, algo.salt1, algo.salt2);\r\n const x = str2bigInt(bytesToHex(pw_hash), 16);\r\n \r\n //log('computed pw_hash:', pw_hash, x, bytesToHex(new Uint8Array(pw_hash)));\r\n \r\n const padArray = function(arr: number[] | Uint8Array, len: number) {\r\n if(!(arr instanceof Uint8Array)) {\r\n arr = convertToUint8Array(arr);\r\n }\r\n \r\n return addPadding(arr, len, true, true, true);\r\n };\r\n \r\n const v = powMod(g, x, p);\r\n \r\n const flipper = (arr: Uint8Array | number[]) => {\r\n const out = new Uint8Array(arr.length);\r\n for(let i = 0; i < arr.length; i += 4) {\r\n out[i] = arr[i + 3];\r\n out[i + 1] = arr[i + 2];\r\n out[i + 2] = arr[i + 1];\r\n out[i + 3] = arr[i];\r\n }\r\n \r\n return out;\r\n };\r\n \r\n // * https://core.telegram.org/api/srp#setting-a-new-2fa-password\r\n if(isNew) {\r\n const bytes = bytesFromHex(bigInt2str(v, 16));\r\n return padArray(/* (isBigEndian ? bytes.reverse() : bytes) */bytes, 256);\r\n }\r\n \r\n const B = str2bigInt(bytesToHex(state.srp_B), 16);\r\n //log('B', bigInt2str(B, 16));\r\n \r\n const pForHash = padArray(bytesFromHex(bigInt2str(p, 16)), 256);\r\n const gForHash = padArray(bytesFromHex(bigInt2str(g, 16)), 256); // like uint8array\r\n const b_for_hash = padArray(bytesFromHex(bigInt2str(B, 16)), 256);\r\n /* log(bytesToHex(pForHash));\r\n log(bytesToHex(gForHash));\r\n log(bytesToHex(b_for_hash)); */\r\n\r\n //log('g_x', bigInt2str(g_x, 16));\r\n\r\n const kHash = await CryptoWorker.invokeCrypto('sha256-hash', bufferConcats(pForHash, gForHash));\r\n const k = str2bigInt(bytesToHex(kHash), 16);\r\n\r\n //log('k', bigInt2str(k, 16));\r\n\r\n // kg_x = (k * g_x) % p\r\n const k_v = mod(mult(k, v), p);\r\n\r\n // good\r\n\r\n //log('kg_x', bigInt2str(kg_x, 16));\r\n\r\n const is_good_mod_exp_first = (modexp: any, prime: any) => {\r\n const diff = sub(prime, modexp);\r\n const min_diff_bits_count = 2048 - 64;\r\n const max_mod_exp_size = 256;\r\n if(negative(diff) ||\r\n bitSize(diff) < min_diff_bits_count || \r\n bitSize(modexp) < min_diff_bits_count || \r\n Math.floor((bitSize(modexp) + 7) / 8) > max_mod_exp_size)\r\n return false;\r\n return true;\r\n };\r\n\r\n const generate_and_check_random = async() => {\r\n while(true) {\r\n const a = str2bigInt(bytesToHex(flipper(state.secure_random)), 16);\r\n //const a = str2bigInt('9153faef8f2bb6da91f6e5bc96bc00860a530a572a0f45aac0842b4602d711f8bda8d59fb53705e4ae3e31a3c4f0681955425f224297b8e9efd898fec22046debb7ba8a0bcf2be1ada7b100424ea318fdcef6ccfe6d7ab7d978c0eb76a807d4ab200eb767a22de0d828bc53f42c5a35c2df6e6ceeef9a3487aae8e9ef2271f2f6742e83b8211161fb1a0e037491ab2c2c73ad63c8bd1d739de1b523fe8d461270cedcf240de8da75f31be4933576532955041dc5770c18d3e75d0b357df9da4a5c8726d4fced87d15752400883dc57fa1937ac17608c5446c4774dcd123676d683ce3a1ab9f7e020ca52faafc99969822717c8e07ea383d5fb1a007ba0d170cb', 16);\r\n\r\n //console.log('ITERATION');\r\n\r\n //log('g a p', bigInt2str(g, 16), bigInt2str(a, 16), bigInt2str(p, 16));\r\n\r\n const A = powMod(g, a, p);\r\n //log('A MODPOW', bigInt2str(A, 16));\r\n if(is_good_mod_exp_first(A, p)) {\r\n const a_for_hash = bytesFromHex(bigInt2str(A, 16));\r\n\r\n const s = await CryptoWorker.invokeCrypto('sha256-hash', bufferConcats(a_for_hash, b_for_hash));\r\n const u = str2bigInt(s.hex, 16);\r\n if(!isZero(u) && !negative(u))\r\n return {a, a_for_hash, u};\r\n } \r\n }\r\n }\r\n \r\n\r\n const {a, a_for_hash, u} = await generate_and_check_random();\r\n\r\n /* log('a', bigInt2str(a, 16));\r\n log('a_for_hash', bytesToHex(a_for_hash));\r\n log('u', bigInt2str(u, 16)); */\r\n\r\n // g_b = (B - kg_x) % p\r\n /* log('B - kg_x', bigInt2str(sub(B, kg_x), 16));\r\n log('subtract', bigInt2str(B, 16), bigInt2str(kg_x, 16));\r\n log('B - kg_x', bigInt2str(sub(B, kg_x), 16)); */\r\n\r\n let g_b: number[];\r\n if(!greater(B, k_v)) {\r\n //log('negative');\r\n g_b = add(B, p);\r\n } else g_b = B;\r\n g_b = mod(sub(g_b, k_v), p);\r\n /* let g_b = sub(B, kg_x);\r\n if(negative(g_b)) g_b = add(g_b, p); */\r\n \r\n //log('g_b', bigInt2str(g_b, 16));\r\n\r\n /* if(!is_good_mod_exp_first(g_b, p))\r\n throw new Error('bad g_b'); */\r\n\r\n const ux = mult(u, x);\r\n //log('u and x multiply', bigInt2str(u, 16), bigInt2str(x, 16), bigInt2str(ux, 16));\r\n const a_ux = add(a, ux);\r\n const S = powMod(g_b, a_ux, p);\r\n\r\n const K = await CryptoWorker.invokeCrypto('sha256-hash', padArray(bytesFromHex(bigInt2str(S, 16)), 256));\r\n\r\n //log('K', bytesToHex(K), new Uint32Array(new Uint8Array(K).buffer));\r\n\r\n let h1 = await CryptoWorker.invokeCrypto('sha256-hash', pForHash);\r\n const h2 = await CryptoWorker.invokeCrypto('sha256-hash', gForHash);\r\n h1 = bytesXor(h1, h2);\r\n\r\n const buff = bufferConcats(h1, \r\n await CryptoWorker.invokeCrypto('sha256-hash', algo.salt1),\r\n await CryptoWorker.invokeCrypto('sha256-hash', algo.salt2),\r\n a_for_hash,\r\n b_for_hash,\r\n K\r\n );\r\n\r\n const M1 = await CryptoWorker.invokeCrypto('sha256-hash', buff);\r\n\r\n const out = {\r\n _: 'inputCheckPasswordSRP', \r\n srp_id: state.srp_id, \r\n A: new Uint8Array(a_for_hash), \r\n M1\r\n } as InputCheckPasswordSRP.inputCheckPasswordSRP;\r\n\r\n\r\n //log('out', bytesToHex(out.A), bytesToHex(out.M1));\r\n return out;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov <igor.beatle@gmail.com>\r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\n// import { MOUNT_CLASS_TO } from '../../config/debug';\r\nimport CryptoWorkerMethods, { CryptoMethods } from './crypto_methods';\r\n\r\n \r\nimport { aesDecryptSync, aesEncryptSync, bytesModPow, gzipUncompress, hash_pbkdf2, pqPrimeFactorization, rsaEncrypt, sha1HashSync, sha256HashSync } from './crypto_utils';\r\nimport { computeSRP } from './srp';\r\n \r\n\r\ntype Task = {\r\n taskId: number,\r\n task: string,\r\n args: any[]\r\n};\r\n\r\nclass CryptoWorker extends CryptoWorkerMethods {\r\n private webWorker: Worker | boolean = false;\r\n private taskId = 0;\r\n private awaiting: {\r\n [id: number]: {\r\n resolve: any,\r\n reject: any,\r\n taskName: string\r\n }\r\n } = {} as any;\r\n private pending: Array<Task> = [];\r\n private debug = false;\r\n\r\n private utils: CryptoMethods;\r\n\r\n constructor() {\r\n super();\r\n console.log('CW constructor');\r\n\r\n \r\n this.utils = {\r\n 'sha1-hash': sha1HashSync,\r\n 'sha256-hash': sha256HashSync,\r\n 'pbkdf2': hash_pbkdf2,\r\n 'aes-encrypt': aesEncryptSync,\r\n 'aes-decrypt': aesDecryptSync,\r\n 'rsa-encrypt': rsaEncrypt,\r\n 'factorize': pqPrimeFactorization,\r\n 'mod-pow': bytesModPow,\r\n 'gzipUncompress': gzipUncompress,\r\n 'computeSRP': computeSRP\r\n };\r\n\r\n // Promise.all([\r\n // import('./crypto_utils').then(utils => {\r\n // Object.assign(this.utils, {\r\n // 'sha1-hash': utils.sha1HashSync,\r\n // 'sha256-hash': utils.sha256HashSync,\r\n // 'pbkdf2': utils.hash_pbkdf2,\r\n // 'aes-encrypt': utils.aesEncryptSync,\r\n // 'aes-decrypt': utils.aesDecryptSync,\r\n // 'rsa-encrypt': utils.rsaEncrypt,\r\n // 'factorize': utils.pqPrimeFactorization,\r\n // 'mod-pow': utils.bytesModPow,\r\n // 'gzipUncompress': utils.gzipUncompress,\r\n // });\r\n // }),\r\n\r\n // import('./srp').then(srp => {\r\n // this.utils.computeSRP = srp.computeSRP;\r\n // })/* ,\r\n\r\n // import('../bin_utils').then(utils => {\r\n // this.utils.unzip = utils.gzipUncompress;\r\n // }) */\r\n // ]);\r\n\r\n return;\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n }\r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n public performTaskWorker<T>(task: string, ...args: any[]) {\r\n this.debug && console.log('CW start', task, args);\r\n\r\n \r\n // @ts-ignore\r\n return Promise.resolve<T>(this.utils[task](...args));\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n }\r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n}\r\n\r\nconst cryptoWorker = new CryptoWorker();\r\n// MOUNT_CLASS_TO.CryptoWorker = cryptoWorker;\r\nexport default cryptoWorker;\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov <igor.beatle@gmail.com>\n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport sessionStorage from '../sessionStorage';\nimport { longFromInts } from './bin_utils';\nimport { nextRandomUint } from '../../helpers/random';\nimport { MOUNT_CLASS_TO } from '../../config/debug';\nimport { WorkerTaskVoidTemplate } from '../../types';\nimport { notifySomeone } from '../../helpers/context';\n\n/*\nlet lol: any = {};\nfor(var i = 0; i < 100; i++) {\n timeManager.generateId();\n}\n*/\n\nexport interface ApplyServerTimeOffsetTask extends WorkerTaskVoidTemplate {\n type: 'applyServerTimeOffset',\n payload: TimeManager['timeOffset']\n};\n\nexport class TimeManager {\n private lastMessageId: [number, number] = [0, 0];\n private timeOffset: number = 0;\n\n constructor() {\n sessionStorage.get('server_time_offset').then((to) => {\n if(to) {\n this.timeOffset = to;\n }\n });\n }\n\n public generateId(): string {\n const timeTicks = Date.now(),\n timeSec = Math.floor(timeTicks / 1000) + this.timeOffset,\n timeMSec = timeTicks % 1000,\n random = nextRandomUint(16);\n\n let messageId: TimeManager['lastMessageId'] = [timeSec, (timeMSec << 21) | (random << 3) | 4];\n if(this.lastMessageId[0] > messageId[0] ||\n this.lastMessageId[0] === messageId[0] && this.lastMessageId[1] >= messageId[1]) {\n messageId = [this.lastMessageId[0], this.lastMessageId[1] + 4];\n }\n\n this.lastMessageId = messageId;\n\n const ret = longFromInts(messageId[0], messageId[1]);\n\n // if(lol[ret]) {\n // console.error('[TimeManager]: Generated SAME msg id', messageId, this.timeOffset, ret);\n // }\n // lol[ret] = true;\n\n // console.log('[TimeManager]: Generated msg id', messageId, this.timeOffset, ret);\n\n return ret\n }\n\n public applyServerTime(serverTime: number, localTime?: number) {\n localTime = (localTime || Date.now()) / 1000 | 0;\n const newTimeOffset = serverTime - localTime;\n const changed = Math.abs(this.timeOffset - newTimeOffset) > 10;\n sessionStorage.set({\n server_time_offset: newTimeOffset\n });\n\n this.lastMessageId = [0, 0];\n this.timeOffset = newTimeOffset;\n \n //console.log('[TimeManager]: Apply server time', serverTime, localTime, newTimeOffset, changed);\n\n \n const task: ApplyServerTimeOffsetTask = {\n type: 'applyServerTimeOffset',\n payload: newTimeOffset\n };\n notifySomeone(task);\n \n\n return changed;\n }\n}\n\nconst timeManager = new TimeManager();\nMOUNT_CLASS_TO.timeManager = timeManager;\nexport default timeManager;\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n//import aesjs from 'aes-js';\r\nimport AES from \"@cryptography/aes\";\r\nimport { bytesFromWordss } from \"../../../helpers/bytes\";\r\nimport { Codec } from \"./codec\";\r\n\r\nclass Counter {\r\n _counter: Uint8Array;\r\n\r\n constructor(initialValue: Uint8Array) {\r\n this._counter = initialValue;\r\n }\r\n\r\n increment() {\r\n for(let i = 15; i >= 0; i--) {\r\n if(this._counter[i] === 255) {\r\n this._counter[i] = 0;\r\n } else {\r\n this._counter[i]++;\r\n break;\r\n }\r\n }\r\n }\r\n}\r\n\r\nclass CTR {\r\n _counter: Counter;\r\n _remainingCounter: Uint8Array = null;\r\n _remainingCounterIndex = 16;\r\n _aes: AES;\r\n\r\n constructor(key: Uint8Array, counter: Uint8Array) {\r\n this._counter = new Counter(counter);\r\n this._aes = new AES(key);\r\n }\r\n\r\n update(payload: Uint8Array) {\r\n const encrypted = payload.slice();\r\n\r\n for(let i = 0; i < encrypted.length; i++) {\r\n if(this._remainingCounterIndex === 16) {\r\n this._remainingCounter = new Uint8Array(bytesFromWordss(this._aes.encrypt(this._counter._counter)));\r\n this._remainingCounterIndex = 0;\r\n this._counter.increment();\r\n }\r\n\r\n encrypted[i] ^= this._remainingCounter[this._remainingCounterIndex++];\r\n }\r\n\r\n return encrypted;\r\n }\r\n}\r\n\r\n/* \r\n@cryptography/aes не работает с массивами которые не кратны 4, поэтому использую intermediate а не abridged\r\n*/\r\nexport default class Obfuscation {\r\n /* public enc: aesjs.ModeOfOperation.ModeOfOperationCTR;\r\n public dec: aesjs.ModeOfOperation.ModeOfOperationCTR; */\r\n\r\n public encNew: CTR;\r\n public decNew: CTR;\r\n\r\n public init(codec: Codec) {\r\n const initPayload = new Uint8Array(64);\r\n initPayload.randomize();\r\n \r\n while(true) {\r\n let val = (initPayload[3] << 24) | (initPayload[2] << 16) | (initPayload[1] << 8) | (initPayload[0]);\r\n let val2 = (initPayload[7] << 24) | (initPayload[6] << 16) | (initPayload[5] << 8) | (initPayload[4]);\r\n if(initPayload[0] !== 0xef &&\r\n val !== 0x44414548 &&\r\n val !== 0x54534f50 &&\r\n val !== 0x20544547 &&\r\n val !== 0x4954504f &&\r\n val !== 0xeeeeeeee &&\r\n val !== 0xdddddddd &&\r\n val2 !== 0x00000000) {\r\n //initPayload[56] = initPayload[57] = initPayload[58] = initPayload[59] = transport;\r\n break;\r\n }\r\n initPayload.randomize();\r\n }\r\n\r\n ////////////////////////initPayload.subarray(60, 62).hex = dcId;\r\n /* initPayload.set(new Uint8Array([161, 208, 67, 71, 118, 109, 20, 111, 113, 255, 134, 10, 159, 241, 7, 44, 217, 82, 187, 76, 108, 131, 200, 186, 33, 57, 177, 251, 52, 34, 18, 54, 65, 105, 37, 89, 38, 20, 47, 168, 126, 181, 24, 138, 212, 68, 60, 150, 225, 37, 181, 4, 201, 50, 72, 151, 168, 143, 204, 169, 81, 187, 241, 23]));\r\n console.log('initPayload', initPayload); */\r\n\r\n const reversedPayload = initPayload.slice().reverse();\r\n\r\n const encKey = initPayload.slice(8, 40);\r\n const encIv = initPayload.slice(40, 56);\r\n const decKey = reversedPayload.slice(8, 40);\r\n const decIv = reversedPayload.slice(40, 56);\r\n\r\n /* this.enc = new aesjs.ModeOfOperation.ctr(encKey, new aesjs.Counter(encIv as any));\r\n this.dec = new aesjs.ModeOfOperation.ctr(decKey, new aesjs.Counter(decIv as any)); */\r\n\r\n // console.log('encKey', encKey.hex, encIv.hex);\r\n // console.log('decKey', decKey.hex, decIv.hex);\r\n\r\n this.encNew = new CTR(encKey, encIv);\r\n this.decNew = new CTR(decKey, decIv);\r\n\r\n initPayload.set(codec.obfuscateTag, 56);\r\n const encrypted = this.encode(initPayload);\r\n\r\n //console.log('encrypted', encrypted);\r\n\r\n initPayload.set(encrypted.slice(56, 64), 56);\r\n\r\n return initPayload;\r\n }\r\n\r\n /* public encode(payload: Uint8Array) {\r\n let startTime = performance.now();\r\n let res = this.enc.encrypt(payload);\r\n let time = performance.now() - startTime;\r\n\r\n try {\r\n startTime = performance.now();\r\n let arr = this.encNew.encrypt(payload);\r\n //let resNew = bytesFromWords({words: arr, sigBytes: arr.length});\r\n let resNew = new Uint8Array(bytesFromWordss(arr));\r\n let time2 = performance.now() - startTime;\r\n console.log('Obfuscation: encode comparison:', res, arr, resNew, res.hex === resNew.hex, time2 < time);\r\n } catch(err) {\r\n console.error('Obfuscation: error:', err);\r\n }\r\n \r\n return res;\r\n }\r\n\r\n public decode(payload: Uint8Array) {\r\n let res = this.dec.encrypt(payload);\r\n\r\n try {\r\n let arr = this.decNew.decrypt(payload);\r\n //let resNew = bytesFromWords({words: arr, sigBytes: arr.length});\r\n let resNew = new Uint8Array(bytesFromWordss(arr));\r\n console.log('Obfuscation: decode comparison:', res, arr, resNew, res.hex === resNew.hex);\r\n } catch(err) {\r\n console.error('Obfuscation: error:', err);\r\n }\r\n \r\n return res;\r\n } */\r\n public encode(payload: Uint8Array) {\r\n return this.encNew.update(payload);\r\n }\r\n\r\n public decode(payload: Uint8Array) {\r\n return this.decNew.update(payload);\r\n }\r\n /* public encode(payload: Uint8Array) {\r\n let res = this.encNew.encrypt(payload);\r\n let bytes = new Uint8Array(bytesFromWordss(res));\r\n \r\n return bytes;\r\n }\r\n\r\n public decode(payload: Uint8Array) {\r\n let res = this.decNew.decrypt(payload);\r\n let bytes = new Uint8Array(bytesFromWordss(res));\r\n \r\n return bytes;\r\n } */\r\n}","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { Codec } from \"./codec\";\r\n\r\nexport class IntermediatePacketCodec implements Codec {\r\n public tag = 0xee;\r\n public obfuscateTag = new Uint8Array([this.tag, this.tag, this.tag, this.tag]);\r\n\r\n //private lol = 0;\r\n\r\n public encodePacket(data: Uint8Array) {\r\n if((data.length % 4) !== 0) {\r\n console.error('Encode error!', data.length, data);\r\n }\r\n\r\n const len = data.length;\r\n const header = new Uint8Array(new Int32Array([/* ++this.lol >= 25 ? 0x80000001 : */len]).buffer);\r\n\r\n //console.log('got nobody cause im braindead', header, len, /* data, */data.buffer.byteLength === data.length);\r\n return header.concat(data);\r\n }\r\n\r\n public readPacket(data: Uint8Array) {\r\n const length = data[0] | (data[1] << 8) | (data[2] << 16) | (data[3] << 24);\r\n\r\n return data.slice(4, 4 + length);\r\n }\r\n}\r\n\r\nexport default new IntermediatePacketCodec();\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport Modes from \"../../../config/modes\";\nimport { logger, LogTypes } from \"../../logger\";\nimport MTPNetworker from \"../networker\";\nimport Obfuscation from \"./obfuscation\";\nimport MTTransport, { MTConnection, MTConnectionConstructable } from \"./transport\";\nimport intermediatePacketCodec from './intermediate';\nimport { ConnectionStatus } from \"../connectionStatus\";\n\n \nimport transportController from \"./controller\";\n \n\nexport default class TcpObfuscated implements MTTransport {\n private codec = intermediatePacketCodec;\n private obfuscation = new Obfuscation();\n public networker: MTPNetworker;\n\n private pending: Array<Partial<{\n resolve: any, \n reject: any, \n body: Uint8Array, \n encoded?: Uint8Array,\n bodySent: boolean\n }>> = [];\n\n private debug = Modes.debug && false/* true */;\n private log: ReturnType<typeof logger>;\n public connected = false;\n private lastCloseTime: number;\n public connection: MTConnection;\n\n private autoReconnect = true;\n private reconnectTimeout: number;\n\n //private debugPayloads: MTPNetworker['debugRequests'] = [];\n\n constructor(private Connection: MTConnectionConstructable, \n private dcId: number, \n private url: string, \n private logSuffix: string, \n private retryTimeout: number\n ) {\n let logTypes = LogTypes.Error | LogTypes.Log;\n if(this.debug) logTypes |= LogTypes.Debug;\n this.log = logger(`TCP-${dcId}` + logSuffix, logTypes);\n this.log('constructor');\n \n this.connect();\n }\n\n private onOpen = () => {\n this.connected = true;\n\n \n transportController.setTransportOpened('websocket');\n \n\n const initPayload = this.obfuscation.init(this.codec);\n\n this.connection.send(initPayload);\n\n if(this.networker) {\n this.pending.length = 0; // ! clear queue and reformat messages to container, because if sending simultaneously 10+ messages, connection will die\n this.networker.setConnectionStatus(ConnectionStatus.Connected);\n this.networker.cleanupSent();\n this.networker.resend();\n } else {\n for(const pending of this.pending) {\n if(pending.encoded && pending.body) {\n pending.encoded = this.encodeBody(pending.body);\n }\n }\n }\n\n setTimeout(() => {\n this.releasePending();\n }, 0);\n };\n\n private onMessage = (buffer: ArrayBuffer) => {\n let data = this.obfuscation.decode(new Uint8Array(buffer));\n data = this.codec.readPacket(data);\n\n if(this.networker) { // authenticated!\n //this.pending = this.pending.filter(p => p.body); // clear pending\n\n this.debug && this.log.debug('redirecting to networker', data.length);\n this.networker.parseResponse(data).then(response => {\n this.debug && this.log.debug('redirecting to networker response:', response);\n\n try {\n this.networker.processMessage(response.response, response.messageId, response.sessionId);\n } catch(err) {\n this.log.error('handleMessage networker processMessage error', err);\n }\n\n //this.releasePending();\n }).catch(err => {\n this.log.error('handleMessage networker parseResponse error', err);\n });\n\n //this.dd();\n return;\n }\n\n //console.log('got hex:', data.hex);\n const pending = this.pending.shift();\n if(!pending) {\n this.debug && this.log.debug('no pending for res:', data.hex);\n return;\n }\n\n pending.resolve(data);\n };\n\n private onClose = () => {\n this.clear();\n \n let needTimeout: number, retryAt: number;\n if(this.autoReconnect) {\n const time = Date.now();\n const diff = time - this.lastCloseTime;\n needTimeout = !isNaN(diff) && diff < this.retryTimeout ? this.retryTimeout - diff : 0;\n retryAt = time + needTimeout;\n }\n \n if(this.networker) {\n this.networker.setConnectionStatus(ConnectionStatus.Closed, retryAt);\n this.pending.length = 0;\n }\n\n if(this.autoReconnect) {\n this.log('will try to reconnect after timeout:', needTimeout / 1000);\n this.reconnectTimeout = self.setTimeout(this.reconnect, needTimeout);\n } else {\n this.log('reconnect isn\\'t needed');\n }\n };\n\n public clear() {\n \n if(this.connected) {\n transportController.setTransportClosed('websocket');\n }\n \n\n this.connected = false;\n\n if(this.connection) {\n this.connection.removeEventListener('open', this.onOpen);\n this.connection.removeEventListener('close', this.onClose);\n this.connection.removeEventListener('message', this.onMessage);\n this.connection = undefined;\n }\n }\n\n /**\n * invoke only when closed\n */\n public reconnect = () => {\n if(this.reconnectTimeout !== undefined) {\n clearTimeout(this.reconnectTimeout);\n this.reconnectTimeout = undefined;\n }\n\n if(this.connection) {\n return;\n }\n\n this.log('trying to reconnect...');\n this.lastCloseTime = Date.now();\n \n if(!this.networker) {\n for(const pending of this.pending) {\n if(pending.bodySent) {\n pending.bodySent = false;\n }\n }\n } else {\n this.networker.setConnectionStatus(ConnectionStatus.Connecting);\n }\n\n this.connect();\n }\n\n public forceReconnect() {\n this.close();\n this.reconnect();\n }\n\n public destroy() {\n this.setAutoReconnect(false);\n this.close();\n\n this.pending.forEach(pending => {\n if(pending.reject) {\n pending.reject();\n }\n });\n this.pending.length = 0;\n }\n\n public close() {\n const connection = this.connection;\n if(connection) {\n const connected = this.connected;\n this.clear();\n if(connected) { // wait for buffered messages if they are there\n connection.addEventListener('message', this.onMessage);\n connection.addEventListener('close', () => {\n connection.removeEventListener('message', this.onMessage);\n }, {once: true});\n connection.close();\n }\n }\n }\n\n /**\n * Will connect if enable and disconnected \\\n * Will reset reconnection timeout if disable\n */\n public setAutoReconnect(enable: boolean) {\n this.autoReconnect = enable;\n\n if(!enable) {\n if(this.reconnectTimeout !== undefined) {\n clearTimeout(this.reconnectTimeout);\n this.reconnectTimeout = undefined;\n }\n } else if(!this.connection && this.reconnectTimeout === undefined) {\n this.reconnect();\n }\n }\n\n private connect() {\n if(this.connection) {\n this.close();\n }\n\n this.connection = new this.Connection(this.dcId, this.url, this.logSuffix);\n this.connection.addEventListener('open', this.onOpen);\n this.connection.addEventListener('close', this.onClose);\n this.connection.addEventListener('message', this.onMessage);\n }\n\n private encodeBody(body: Uint8Array) {\n const toEncode = this.codec.encodePacket(body);\n\n //this.log('send before obf:', /* body.hex, nonce.hex, */ toEncode.hex);\n const encoded = this.obfuscation.encode(toEncode);\n //this.log('send after obf:', enc.hex);\n\n return encoded;\n }\n\n public send(body: Uint8Array) {\n this.debug && this.log.debug('-> body length to pending:', body.length);\n\n const encoded: typeof body = this.connected ? this.encodeBody(body) : undefined;\n\n //return;\n\n if(this.networker) {\n this.pending.push({body, encoded});\n this.releasePending();\n } else {\n const promise = new Promise<typeof body>((resolve, reject) => {\n this.pending.push({resolve, reject, body, encoded});\n });\n\n this.releasePending();\n\n return promise;\n }\n }\n\n private releasePending(/* tt = false */) {\n if(!this.connected) {\n //this.connect();\n return;\n }\n\n /* if(!tt) {\n this.releasePendingDebounced();\n return;\n } */\n\n //this.log('-> messages to send:', this.pending.length);\n let length = this.pending.length;\n //for(let i = length - 1; i >= 0; --i) {\n for(let i = 0; i < length; ++i) {\n const pending = this.pending[i];\n const {body, bodySent} = pending;\n let encoded = pending.encoded;\n if(body && !bodySent) {\n\n //this.debugPayloads.push({before: body.slice(), after: enc});\n\n this.debug && this.log.debug('-> body length to send:', body.length);\n\n if(!encoded) {\n encoded = pending.encoded = this.encodeBody(body);\n }\n\n this.connection.send(encoded);\n \n if(!pending.resolve) { // remove if no response needed\n this.pending.splice(i--, 1);\n length--;\n } else {\n pending.bodySent = true;\n }\n\n //delete pending.body;\n }\n }\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { notifyAll } from \"../../../helpers/context\";\r\nimport EventListenerBase from \"../../../helpers/eventListenerBase\";\r\nimport { WorkerTaskVoidTemplate } from \"../../../types\";\r\nimport { MTConnection } from \"./transport\";\r\n\r\nlet socketId = 0;\r\nexport interface SocketProxyTask extends WorkerTaskVoidTemplate {\r\n type: 'socketProxy',\r\n payload: SocketProxySetupTask | SocketProxySendTask | SocketProxyCloseTask\r\n};\r\n\r\nexport interface SocketProxySetupTask extends WorkerTaskVoidTemplate {\r\n type: 'setup',\r\n payload: {\r\n dcId: number,\r\n url: string,\r\n logSuffix: string\r\n },\r\n id: number\r\n};\r\n\r\nexport interface SocketProxySendTask extends WorkerTaskVoidTemplate {\r\n type: 'send',\r\n payload: Uint8Array,\r\n id: number\r\n};\r\n\r\nexport interface SocketProxyCloseTask extends WorkerTaskVoidTemplate {\r\n type: 'close',\r\n id: number\r\n};\r\n\r\n \r\nexport default class SocketProxied extends EventListenerBase<{\r\n open: () => void,\r\n message: (buffer: ArrayBuffer) => any,\r\n close: () => void,\r\n}> implements MTConnection {\r\n private id: number;\r\n\r\n constructor(protected dcId: number, protected url: string, logSuffix: string) {\r\n super();\r\n this.id = ++socketId;\r\n socketsProxied.set(this.id, this);\r\n\r\n const task: SocketProxyTask = {\r\n type: 'socketProxy',\r\n payload: {\r\n type: 'setup', \r\n payload: {\r\n dcId, \r\n url,\r\n logSuffix\r\n },\r\n id: this.id\r\n }\r\n };\r\n\r\n notifyAll(task);\r\n }\r\n\r\n public send(payload: Uint8Array) {\r\n const task: SocketProxyTask = {\r\n type: 'socketProxy', \r\n payload: {\r\n type: 'send',\r\n payload,\r\n id: this.id\r\n }\r\n };\r\n\r\n notifyAll(task);\r\n }\r\n\r\n public close() {\r\n const task: SocketProxyTask = {\r\n type: 'socketProxy',\r\n payload: {\r\n type: 'close',\r\n id: this.id\r\n }\r\n };\r\n\r\n notifyAll(task);\r\n }\r\n}\r\n \r\n\r\nexport const socketsProxied: Map<number, SocketProxied> = new Map();\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov <igor.beatle@gmail.com>\r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport MTTransport, { MTConnectionConstructable } from './transports/transport';\r\nimport Modes from '../../config/modes';\r\nimport { indexOfAndSplice } from '../../helpers/array';\r\nimport App from '../../config/app';\r\n\r\n \r\nimport HTTP from './transports/http';\r\n \r\n\r\n \r\nimport Socket from './transports/websocket';\r\nimport TcpObfuscated from './transports/tcpObfuscated';\r\nimport { IS_SAFARI } from '../../environment/userAgent';\r\nimport { IS_WEB_WORKER } from '../../helpers/context';\r\nimport SocketProxied from './transports/socketProxied';\r\nimport { DcId } from '../../types';\r\n \r\n\r\nexport type TransportType = 'websocket' | 'https' | 'http';\r\nexport type ConnectionType = 'client' | 'download' | 'upload';\r\ntype Servers = {\r\n [transportType in TransportType]: {\r\n [connectionType in ConnectionType]: {\r\n [dcId: DcId]: MTTransport[]\r\n }\r\n }\r\n};\r\n\r\nconst TEST_SUFFIX = Modes.test ? '_test' : '';\r\n\r\nexport class DcConfigurator {\r\n private sslSubdomains = ['pluto', 'venus', 'aurora', 'vesta', 'flora'];\r\n\r\n private dcOptions = Modes.test\r\n ? [\r\n {id: 1, host: '149.154.175.10', port: 80},\r\n {id: 2, host: '149.154.167.40', port: 80},\r\n {id: 3, host: '149.154.175.117', port: 80}\r\n ]\r\n : [\r\n {id: 1, host: '149.154.175.50', port: 80},\r\n {id: 2, host: '149.154.167.50', port: 80},\r\n {id: 3, host: '149.154.175.100', port: 80},\r\n {id: 4, host: '149.154.167.91', port: 80},\r\n {id: 5, host: '149.154.171.5', port: 80}\r\n ];\r\n\r\n public chosenServers: Servers = {} as any;\r\n\r\n \r\n private transportSocket = (dcId: DcId, connectionType: ConnectionType, suffix: string) => {\r\n const path = 'apiws' + TEST_SUFFIX;\r\n const chosenServer = `wss://${App.suffix.toLowerCase()}ws${dcId}${suffix}.web.telegram.org/${path}`;\r\n const logSuffix = connectionType === 'upload' ? '-U' : connectionType === 'download' ? '-D' : '';\r\n\r\n const retryTimeout = connectionType === 'client' ? 10000 : 10000;\r\n\r\n const oooohLetMeLive: MTConnectionConstructable = (IS_SAFARI && IS_WEB_WORKER && typeof(SocketProxied) !== 'undefined') /* || true */ ? SocketProxied : Socket;\r\n\r\n return new TcpObfuscated(oooohLetMeLive, dcId, chosenServer, logSuffix, retryTimeout);\r\n };\r\n \r\n\r\n \r\n private transportHTTP = (dcId: DcId, connectionType: ConnectionType, suffix: string) => {\r\n let chosenServer: string;\r\n if(Modes.ssl || !Modes.http) {\r\n const subdomain = this.sslSubdomains[dcId - 1] + (connectionType !== 'client' ? '-1' : '');\r\n const path = Modes.test ? 'apiw_test1' : 'apiw1';\r\n chosenServer = 'https://' + subdomain + '.web.telegram.org/' + path;\r\n } else {\r\n for(let dcOption of this.dcOptions) {\r\n if(dcOption.id === dcId) {\r\n chosenServer = 'http://' + dcOption.host + (dcOption.port !== 80 ? ':' + dcOption.port : '') + '/apiw1';\r\n break;\r\n }\r\n }\r\n }\r\n\r\n const logSuffix = connectionType === 'upload' ? '-U' : connectionType === 'download' ? '-D' : '';\r\n return new HTTP(dcId, chosenServer, logSuffix);\r\n };\r\n \r\n\r\n public chooseServer(\r\n dcId: DcId, \r\n connectionType: ConnectionType = 'client', \r\n transportType: TransportType = Modes.transport, \r\n reuse = true\r\n ) {\r\n /* if(transportType === 'websocket' && !Modes.multipleConnections) {\r\n connectionType = 'client';\r\n } */\r\n\r\n if(!this.chosenServers.hasOwnProperty(transportType)) {\r\n this.chosenServers[transportType] = {\r\n client: {},\r\n download: {},\r\n upload: {}\r\n };\r\n }\r\n\r\n const servers = this.chosenServers[transportType][connectionType];\r\n\r\n if(!(dcId in servers)) {\r\n servers[dcId] = [];\r\n }\r\n\r\n const transports = servers[dcId];\r\n\r\n if(!transports.length || !reuse/* || (upload && transports.length < 1) */) {\r\n let transport: MTTransport;\r\n\r\n const suffix = connectionType === 'client' ? '' : '-1';\r\n\r\n \r\n transport = (transportType === 'websocket' ? this.transportSocket : this.transportHTTP)(dcId, connectionType, suffix);\r\n \r\n \r\n \r\n \r\n \r\n \r\n if(!transport) {\r\n console.error('No chosenServer!', dcId);\r\n return null;\r\n }\r\n \r\n if(reuse) {\r\n transports.push(transport);\r\n }\r\n \r\n return transport;\r\n }\r\n \r\n return transports[0];\r\n }\r\n \r\n public static removeTransport<T>(obj: any, transport: T) {\r\n for(const transportType in obj) {\r\n // @ts-ignore\r\n for(const connectionType in obj[transportType]) {\r\n // @ts-ignore\r\n for(const dcId in obj[transportType][connectionType]) {\r\n // @ts-ignore\r\n const transports: T[] = obj[transportType][connectionType][dcId];\r\n indexOfAndSplice(transports, transport);\r\n }\r\n }\r\n }\r\n }\r\n}\r\n\r\nexport default new DcConfigurator();\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport App from \"../../../config/app\";\nimport { deferredPromise } from \"../../../helpers/cancellablePromise\";\nimport EventListenerBase from \"../../../helpers/eventListenerBase\";\nimport { pause } from \"../../../helpers/schedulers/pause\";\nimport dcConfigurator, { TransportType } from \"../dcConfigurator\";\nimport type HTTP from \"./http\";\nimport type TcpObfuscated from \"./tcpObfuscated\";\nimport MTTransport from \"./transport\";\n\nexport class MTTransportController extends EventListenerBase<{\n change: (opened: MTTransportController['opened']) => void,\n transport: (type: TransportType) => void\n}> {\n private opened: Map<TransportType, number>;\n private transports: {[k in TransportType]?: MTTransport};\n private pinging: boolean;\n\n constructor() {\n super(true);\n\n this.opened = new Map();\n /* this.addEventListener('change', (opened) => {\n this.dispatchEvent('transport', opened.get('websocket') || !opened.get('https') ? 'websocket' : 'https');\n }); */\n\n this.addEventListener('change', (opened) => {\n if(!opened.get('websocket')) {\n this.waitForWebSocket();\n }\n });\n\n setTimeout(() => {\n this.waitForWebSocket();\n }, 200); // wait for first transport so won't have delay for first WS\n }\n\n public async pingTransports() {\n const timeout = 2000;\n const transports: {[k in TransportType]?: MTTransport} = this.transports = {\n https: dcConfigurator.chooseServer(App.baseDcId, 'client', 'https', false),\n websocket: dcConfigurator.chooseServer(App.baseDcId, 'client', 'websocket', false)\n };\n\n const httpPromise = deferredPromise<boolean>();\n ((this.transports.https as HTTP)._send(new Uint8Array(), 'no-cors') as any as Promise<any>)\n .then(() => httpPromise.resolve(true), () => httpPromise.resolve(false));\n setTimeout(() => httpPromise.resolve(false), timeout);\n\n const websocketPromise = deferredPromise<boolean>();\n const socket = transports.websocket as TcpObfuscated;\n socket.setAutoReconnect(false);\n socket.connection.addEventListener('close', () => websocketPromise.resolve(false), {once: true});\n socket.connection.addEventListener('open', () => websocketPromise.resolve(true), {once: true});\n setTimeout(() => websocketPromise.resolve(false), timeout);\n\n const [isHttpAvailable, isWebSocketAvailable] = await Promise.all([httpPromise, websocketPromise]);\n\n for(const transportType in transports) {\n const transport = transports[transportType as TransportType];\n transport.destroy();\n }\n\n const result = {\n https: isHttpAvailable || this.opened.get('https') > 0,\n websocket: isWebSocketAvailable || this.opened.get('websocket') > 0\n };\n\n // result.websocket = false;\n return result;\n }\n\n public async waitForWebSocket() {\n if(this.pinging) return;\n this.pinging = true;\n\n while(true) {\n const {https, websocket} = await this.pingTransports();\n if(https || websocket) {\n this.dispatchEvent('transport', websocket || !https ? 'websocket' : 'https');\n }\n\n if(websocket) {\n break;\n }\n\n await pause(10000);\n }\n\n this.pinging = false;\n }\n\n public setTransportValue(type: TransportType, value: boolean) {\n let length = this.opened.get(type) || 0;\n length += value ? 1 : -1;\n \n this.opened.set(type, length);\n this.dispatchEvent('change', this.opened);\n }\n\n public setTransportOpened(type: TransportType) {\n return this.setTransportValue(type, true);\n }\n\n public setTransportClosed(type: TransportType) {\n return this.setTransportValue(type, false);\n }\n}\n\nconst transportController = new MTTransportController();\nexport default transportController;\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { pause } from '../../../helpers/schedulers/pause';\r\nimport { DcId } from '../../../types';\r\nimport { logger, LogTypes } from '../../logger';\r\nimport type MTPNetworker from '../networker';\r\nimport MTTransport from './transport';\r\nimport Modes from '../../../config/modes';\r\n\r\n \r\nimport transportController from './controller';\r\n \r\n\r\nexport default class HTTP implements MTTransport {\r\n public networker: MTPNetworker;\r\n private log: ReturnType<typeof logger>;\r\n\r\n private pending: Array<{\r\n resolve: (body: Uint8Array) => void, \r\n reject: any, \r\n body: Uint8Array\r\n }> = [];\r\n private releasing: boolean;\r\n\r\n public connected: boolean;\r\n private destroyed: boolean;\r\n private debug: boolean;\r\n \r\n constructor(protected dcId: DcId, protected url: string, logSuffix: string) {\r\n this.debug = Modes.debug && false;\r\n\r\n let logTypes = LogTypes.Error | LogTypes.Log;\r\n if(this.debug) logTypes |= LogTypes.Debug;\r\n \r\n this.log = logger(`HTTP-${dcId}` + logSuffix, logTypes);\r\n this.log('constructor');\r\n\r\n this.connected = false;\r\n }\r\n\r\n public _send(body: Uint8Array, mode?: RequestMode) {\r\n this.debug && this.log.debug('-> body length to send:', body.length);\r\n\r\n return fetch(this.url, {method: 'POST', body, mode}).then(response => {\r\n if(response.status !== 200 && !mode) {\r\n response.arrayBuffer().then(buffer => {\r\n this.log.error('not 200', \r\n new TextDecoder(\"utf-8\").decode(new Uint8Array(buffer)));\r\n });\r\n\r\n throw response;\r\n }\r\n\r\n this.setConnected(true);\r\n\r\n // * test resending by dropping random request\r\n // if(Math.random() > .5) {\r\n // throw 'asd';\r\n // }\r\n\r\n return response.arrayBuffer().then(buffer => {\r\n return new Uint8Array(buffer);\r\n }); \r\n }, (err) => {\r\n this.setConnected(false);\r\n throw err;\r\n });\r\n }\r\n\r\n private setConnected(connected: boolean) {\r\n if(this.connected === connected || this.destroyed) {\r\n return;\r\n }\r\n\r\n this.connected = connected;\r\n\r\n \r\n transportController.setTransportValue('https', connected);\r\n \r\n }\r\n\r\n public destroy() {\r\n this.setConnected(false);\r\n this.destroyed = true;\r\n this.pending.forEach(pending => pending.reject());\r\n this.pending.length = 0;\r\n }\r\n\r\n public send(body: Uint8Array) {\r\n if(this.networker) {\r\n return this._send(body);\r\n } else {\r\n const promise = new Promise<typeof body>((resolve, reject) => {\r\n this.pending.push({resolve, reject, body});\r\n });\r\n\r\n this.releasePending();\r\n\r\n return promise;\r\n }\r\n }\r\n\r\n private async releasePending() {\r\n if(this.releasing) return;\r\n\r\n this.releasing = true;\r\n // this.log('-> messages to send:', this.pending.length);\r\n for(let i = 0; i < this.pending.length; ++i) {\r\n const pending = this.pending[i];\r\n const {body, resolve} = pending;\r\n\r\n try {\r\n const result = await this._send(body);\r\n resolve(result);\r\n this.pending.splice(i, 1);\r\n } catch(err) {\r\n this.log.error('Send plain request error:', err);\r\n await pause(5000);\r\n }\r\n\r\n --i;\r\n }\r\n\r\n this.releasing = false;\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov <igor.beatle@gmail.com>\n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport {isObject, sortLongsArray} from './bin_utils';\nimport {TLDeserialization, TLSerialization} from './tl_utils';\nimport CryptoWorker from '../crypto/cryptoworker';\nimport sessionStorage from '../sessionStorage';\nimport Schema from './schema';\nimport timeManager from './timeManager';\nimport networkerFactory from './networkerFactory';\nimport { logger, LogTypes } from '../logger';\nimport { InvokeApiOptions } from '../../types';\nimport { longToBytes } from '../crypto/crypto_utils';\nimport MTTransport from './transports/transport';\nimport { convertToUint8Array, bytesCmp, bytesToHex, bufferConcats } from '../../helpers/bytes';\nimport { nextRandomUint, randomLong } from '../../helpers/random';\nimport App from '../../config/app';\nimport DEBUG from '../../config/debug';\nimport Modes from '../../config/modes';\nimport noop from '../../helpers/noop';\n\n \nimport HTTP from './transports/http';\n \n\nimport type TcpObfuscated from './transports/tcpObfuscated';\nimport { bigInt2str, rightShift_, str2bigInt } from '../../vendor/leemon';\nimport { forEachReverse } from '../../helpers/array';\nimport { ConnectionStatus } from './connectionStatus';\nimport ctx from '../../environment/ctx';\nimport dcConfigurator, { DcConfigurator } from './dcConfigurator';\n\n//console.error('networker included!', new Error().stack);\n\nexport type MTMessageOptions = InvokeApiOptions & Partial<{\n noResponse: true, // http_wait\n longPoll: true,\n \n notContentRelated: true, // ACK\n noSchedule: true,\n messageId: MTLong,\n}>;\n\nexport type MTMessage = InvokeApiOptions & MTMessageOptions & {\n msg_id: MTLong,\n seq_no: number,\n body?: Uint8Array | number[],\n isAPI?: boolean,\n // only these four are important\n\n acked?: boolean,\n\n deferred?: {\n resolve: any,\n reject: any\n },\n\n container?: boolean,\n inner?: MTLong[],\n\n // below - options\n\n notContentRelated?: true,\n noSchedule?: true,\n\n resultType?: string,\n\n longPoll?: true,\n noResponse?: true, // only with http (http_wait for longPoll)\n};\n\nconst CONNECTION_TIMEOUT = 5000;\nconst DRAIN_TIMEOUT = 10000;\nlet invokeAfterMsgConstructor: number;\n\nexport default class MTPNetworker {\n private authKeyUint8: Uint8Array;\n\n public isFileNetworker: boolean;\n private isFileUpload: boolean;\n private isFileDownload: boolean;\n\n private lastServerMessages: Array<MTLong> = [];\n\n private sentMessages: {\n [msgId: MTLong]: MTMessage\n } = {};\n\n private pendingMessages: {[msgId: MTLong]: number} = {};\n private pendingAcks: Array<MTLong> = [];\n private pendingResends: Array<MTLong> = [];\n public connectionInited: boolean;\n\n private nextReqTimeout: number;\n private nextReq: number = 0;\n \n \n private longPollInterval: number;\n private longPollPending: number;\n private checkConnectionRetryAt: number;\n private checkConnectionTimeout: number;\n private checkConnectionPeriod = 0;\n private sleepAfter: number;\n private offline = false;\n private sendingLongPoll: boolean;\n \n\n private seqNo: number;\n private prevSessionId: Uint8Array;\n private sessionId: Uint8Array;\n private serverSalt: Uint8Array;\n\n private lastResendReq: {\n req_msg_id: MTLong,\n resend_msg_ids: Array<MTLong>\n } | null = null;\n\n private name: string;\n private log: ReturnType<typeof logger>;\n \n public isOnline = false;\n public status: ConnectionStatus = ConnectionStatus.Closed;\n private lastResponseTime = 0;\n\n private debug = DEBUG /* && false */ || Modes.debug;\n\n public activeRequests = 0;\n\n public onDrain: () => void;\n private onDrainTimeout: number;\n\n public transport: MTTransport;\n\n //private disconnectDelay: number;\n //private pingPromise: CancellablePromise<any>;\n //public onConnectionStatusChange: (online: boolean) => void;\n\n //private debugRequests: Array<{before: Uint8Array, after: Uint8Array}> = [];\n\n constructor(\n public dcId: number, \n private authKey: Uint8Array, \n private authKeyId: Uint8Array,\n serverSalt: Uint8Array, \n options: InvokeApiOptions = {}\n ) {\n this.authKeyUint8 = convertToUint8Array(this.authKey);\n this.serverSalt = convertToUint8Array(serverSalt);\n\n this.isFileUpload = !!options.fileUpload;\n this.isFileDownload = !!options.fileDownload;\n this.isFileNetworker = this.isFileUpload || this.isFileDownload;\n\n const suffix = this.isFileUpload ? '-U' : this.isFileDownload ? '-D' : '';\n this.name = 'NET-' + dcId + suffix;\n //this.log = logger(this.name, this.upload && this.dcId === 2 ? LogLevels.debug | LogLevels.warn | LogLevels.log | LogLevels.error : LogLevels.error);\n this.log = logger(this.name, LogTypes.Log | LogTypes.Debug | LogTypes.Error | LogTypes.Warn, undefined);\n this.log('constructor'/* , this.authKey, this.authKeyID, this.serverSalt */);\n\n // Test resend after bad_server_salt\n /* if(this.dcId === 2 && this.upload) {\n //timeManager.applyServerTime((Date.now() / 1000 - 86400) | 0);\n this.serverSalt[0] = 0;\n } */\n\n this.updateSession();\n\n // if(!NetworkerFactory.offlineInited) {\n // NetworkerFactory.offlineInited = true;\n // /* rootScope.offline = true\n // rootScope.offlineConnecting = true */\n // }\n\n // * handle outcoming dead socket, server will close the connection\n // if((this.transport as TcpObfuscated).networker) {\n // this.disconnectDelay = /* (this.transport as TcpObfuscated).retryTimeout */75;\n // //setInterval(this.sendPingDelayDisconnect, (this.disconnectDelay - 5) * 1000);\n // this.sendPingDelayDisconnect();\n // }\n }\n\n private updateSession() {\n this.seqNo = 0;\n this.prevSessionId = this.sessionId;\n this.sessionId = new Uint8Array(8).randomize();\n }\n\n /* private clearContainers() {\n for(const messageId in this.sentMessages) {\n const message = this.sentMessages[messageId];\n if(message.container) {\n delete this.sentMessages[messageId];\n }\n }\n } */\n\n private updateSentMessage(sentMessageId: string) {\n const sentMessage = this.sentMessages[sentMessageId];\n if(!sentMessage) {\n return false;\n }\n\n if(sentMessage.container) {\n forEachReverse(sentMessage.inner, (innerSentMessageId, idx) => {\n const innerSentMessage = this.updateSentMessage(innerSentMessageId);\n if(!innerSentMessage) {\n sentMessage.inner.splice(idx, 1);\n } else {\n sentMessage.inner[idx] = innerSentMessage.msg_id;\n }\n });\n }\n \n sentMessage.msg_id = timeManager.generateId();\n sentMessage.seq_no = this.generateSeqNo(sentMessage.notContentRelated || sentMessage.container);\n\n if(this.debug) {\n this.log(`updateSentMessage, old=${sentMessageId}, new=${sentMessage.msg_id}`);\n }\n\n this.sentMessages[sentMessage.msg_id] = sentMessage;\n delete this.sentMessages[sentMessageId];\n \n return sentMessage;\n }\n\n private generateSeqNo(notContentRelated?: boolean) {\n let seqNo = this.seqNo * 2;\n \n if(!notContentRelated) {\n seqNo++;\n this.seqNo++;\n }\n \n return seqNo;\n }\n\n public wrapMtpCall(method: string, params: any, options: MTMessageOptions) {\n const serializer = new TLSerialization({mtproto: true});\n \n serializer.storeMethod(method, params);\n \n const messageId = timeManager.generateId();\n const seqNo = this.generateSeqNo();\n const message = {\n msg_id: messageId,\n seq_no: seqNo,\n body: serializer.getBytes(true)\n };\n \n if(Modes.debug) {\n this.log('MT call', method, params, messageId, seqNo);\n }\n \n return this.pushMessage(message, options);\n }\n \n public wrapMtpMessage(object: any, options: MTMessageOptions) {\n const serializer = new TLSerialization({mtproto: true});\n serializer.storeObject(object, 'Object');\n \n const messageId = timeManager.generateId();\n const seqNo = this.generateSeqNo(options.notContentRelated);\n const message = {\n msg_id: messageId,\n seq_no: seqNo,\n body: serializer.getBytes(true)\n };\n \n if(Modes.debug) {\n this.log('MT message', object, messageId, seqNo);\n }\n \n return this.pushMessage(message, options);\n }\n\n public wrapApiCall(method: string, params: any = {}, options: InvokeApiOptions = {}) {\n const serializer = new TLSerialization(options);\n \n if(!this.connectionInited) { // this will call once for each new session\n ///////this.log('Wrap api call !this.connectionInited');\n\n const invokeWithLayer = Schema.API.methods.find(m => m.method === 'invokeWithLayer');\n if(!invokeWithLayer) throw new Error('no invokeWithLayer!');\n serializer.storeInt(+invokeWithLayer.id, 'invokeWithLayer');\n\n // @ts-ignore\n serializer.storeInt(Schema.layer, 'layer');\n \n const initConnection = Schema.API.methods.find(m => m.method === 'initConnection');\n if(!initConnection) throw new Error('no initConnection!');\n \n serializer.storeInt(+initConnection.id, 'initConnection');\n serializer.storeInt(0x0, 'flags');\n serializer.storeInt(App.id, 'api_id');\n serializer.storeString(networkerFactory.userAgent || 'Unknown UserAgent', 'device_model');\n serializer.storeString(navigator.platform || 'Unknown Platform', 'system_version');\n serializer.storeString(App.version + (App.isMainDomain ? ' ' + App.suffix : ''), 'app_version');\n serializer.storeString(navigator.language || 'en', 'system_lang_code');\n serializer.storeString(App.langPack, 'lang_pack');\n serializer.storeString(networkerFactory.language, 'lang_code');\n //serializer.storeInt(0x0, 'proxy');\n /* serializer.storeMethod('initConnection', {\n 'flags': 0,\n 'api_id': App.id,\n 'device_model': navigator.userAgent || 'Unknown UserAgent',\n 'system_version': navigator.platform || 'Unknown Platform',\n 'app_version': App.version,\n 'system_lang_code': navigator.language || 'en',\n 'lang_pack': '',\n 'lang_code': navigator.language || 'en'\n }); */\n }\n \n if(options.afterMessageId) {\n if(invokeAfterMsgConstructor === undefined) {\n const m = Schema.API.methods.find(m => m.method === 'invokeAfterMsg');\n invokeAfterMsgConstructor = m ? +m.id : 0;\n }\n \n if(invokeAfterMsgConstructor) {\n // if(this.debug) {\n // this.log('invokeApi: store invokeAfterMsg');\n // }\n \n serializer.storeInt(invokeAfterMsgConstructor, 'invokeAfterMsg');\n serializer.storeLong(options.afterMessageId, 'msg_id');\n } else {\n this.log.error('no invokeAfterMsg!');\n }\n }\n \n options.resultType = serializer.storeMethod(method, params);\n\n /* if(method === 'account.updateNotifySettings') {\n this.log('api call body:', serializer.getBytes(true));\n } */\n \n const messageId = timeManager.generateId();\n const seqNo = this.generateSeqNo();\n const message = {\n msg_id: messageId,\n seq_no: seqNo,\n body: serializer.getBytes(true),\n isAPI: true\n };\n \n if(Modes.debug/* || true */) {\n this.log('Api call', method, message, params, options);\n } else if(this.debug) {\n this.log('Api call', method, params, options);\n }\n \n return this.pushMessage(message, options);\n }\n\n public changeTransport(transport?: MTTransport) {\n const oldTransport = this.transport;\n if(oldTransport) {\n oldTransport.destroy();\n\n DcConfigurator.removeTransport(dcConfigurator.chosenServers, this.transport);\n\n if(this.nextReqTimeout) {\n clearTimeout(this.nextReqTimeout);\n this.nextReqTimeout = 0;\n this.nextReq = 0;\n }\n\n \n if(this.longPollInterval !== undefined) {\n clearInterval(this.longPollInterval);\n this.longPollInterval = undefined;\n }\n\n this.clearCheckConnectionTimeout();\n \n }\n\n this.transport = transport;\n if(!transport) {\n return;\n }\n\n transport.networker = this;\n\n \n \n if(transport instanceof HTTP) {\n \n this.longPollInterval = ctx.setInterval(this.checkLongPoll, 10000);\n this.checkLongPoll();\n this.checkConnection('changed transport');\n \n }\n \n \n\n if(transport.connected && (transport as TcpObfuscated).connection) {\n this.setConnectionStatus(ConnectionStatus.Connected);\n }\n\n this.resend();\n }\n\n public destroy() {\n this.changeTransport();\n }\n\n public forceReconnectTimeout() {\n if((this.transport as TcpObfuscated).reconnect) {\n (this.transport as TcpObfuscated).reconnect();\n } else {\n this.resend();\n }\n }\n\n public forceReconnect() {\n if((this.transport as TcpObfuscated).forceReconnect) {\n (this.transport as TcpObfuscated).forceReconnect();\n } else {\n this.checkConnection('force reconnect');\n }\n }\n\n // private sendPingDelayDisconnect = () => {\n // if(this.pingPromise || true) return;\n\n // if(!this.isOnline) {\n // if((this.transport as TcpObfuscated).connected) {\n // (this.transport as TcpObfuscated).handleClose();\n // }\n\n // return;\n // }\n\n // this.log('sendPingDelayDisconnect', this.sentPingTimes);\n\n // /* if(this.tt) clearTimeout(this.tt);\n // this.tt = self.setTimeout(() => { \n // (this.transport as any).ws.close(1000);\n // this.tt = 0;\n // }, this.disconnectDelay * 1000); */\n // /* this.wrapMtpCall('ping_delay_disconnect', {\n // ping_id: randomLong(),\n // disconnect_delay: this.disconnectDelay\n // }, {\n // noResponse: true,\n // notContentRelated: true\n // }); */\n // const deferred = this.pingPromise = deferredPromise<void>();\n\n // const timeoutTime = this.disconnectDelay * 1000;\n\n // /* if(!this.sentPingTimes || true) {\n // ++this.sentPingTimes; */\n // const startTime = Date.now();\n // this.wrapMtpCall('ping', {\n // ping_id: randomLong()\n // }, {}).then(pong => {\n // const elapsedTime = Date.now() - startTime;\n // this.log('sendPingDelayDisconnect: response', pong, elapsedTime > timeoutTime);\n\n // if(elapsedTime > timeoutTime) {\n // deferred.reject();\n // } else {\n // setTimeout(deferred.resolve, timeoutTime - elapsedTime);\n // }\n // }, deferred.reject).finally(() => {\n // clearTimeout(rejectTimeout);\n // //--this.sentPingTimes;\n // });\n // //}\n\n // const rejectTimeout = self.setTimeout(deferred.reject, timeoutTime);\n\n // deferred.catch(() => {\n // (this.transport as Socket).handleClose();\n // });\n\n // deferred.finally(() => {\n // this.pingPromise = null;\n // this.sendPingDelayDisconnect();\n // });\n // };\n\n // private sendPingDelayDisconnect = () => {\n // if(this.pingPromise || true) return;\n\n // /* if(!this.isOnline) {\n // if((this.transport as TcpObfuscated).connected) {\n // (this.transport as TcpObfuscated).connection.close();\n // }\n\n // return;\n // } */\n\n // const deferred = this.pingPromise = deferredPromise<void>();\n\n // const timeoutTime = this.disconnectDelay * 1000;\n\n // const startTime = Date.now();\n // this.wrapMtpCall('ping_delay_disconnect', {\n // ping_id: randomLong(),\n // disconnect_delay: this.disconnectDelay\n // }, {}).then(pong => {\n // const elapsedTime = Date.now() - startTime;\n // this.log('sendPingDelayDisconnect: response', pong, elapsedTime > timeoutTime);\n\n // if(elapsedTime > timeoutTime) {\n // deferred.reject();\n // } else {\n // setTimeout(deferred.resolve, timeoutTime - elapsedTime);\n // }\n // }, deferred.reject).finally(() => {\n // clearTimeout(rejectTimeout);\n // //--this.sentPingTimes;\n // });\n\n // const rejectTimeout = self.setTimeout(deferred.reject, timeoutTime);\n\n // deferred.catch(() => {\n // this.log.error('sendPingDelayDisconnect: catch, closing connection if exists');\n // (this.transport as TcpObfuscated).connection.close();\n // });\n\n // deferred.finally(() => {\n // this.pingPromise = null;\n // this.sendPingDelayDisconnect();\n // });\n // };\n\n \n private checkLongPoll = () => {\n const isClean = this.cleanupSent();\n //this.log.error('Check lp', this.longPollPending, this.dcId, isClean, this);\n if((this.longPollPending && Date.now() < this.longPollPending) ||\n this.offline ||\n this.isStopped() ||\n this.isFileNetworker) {\n //this.log('No lp this time');\n return false;\n }\n\n sessionStorage.get('dc').then((baseDcId) => {\n if(isClean && (\n baseDcId !== this.dcId ||\n (this.sleepAfter && Date.now() > this.sleepAfter)\n )) {\n //console.warn(dT(), 'Send long-poll for DC is delayed', this.dcId, this.sleepAfter);\n return;\n }\n\n this.sendLongPoll();\n });\n };\n\n private sendLongPoll() {\n if(this.sendingLongPoll) return;\n this.sendingLongPoll = true;\n const maxWait = 25000;\n\n this.longPollPending = Date.now() + maxWait;\n this.debug && this.log.debug('sendLongPoll', this.longPollPending);\n \n this.wrapMtpCall('http_wait', {\n max_delay: 500,\n wait_after: 150,\n max_wait: maxWait\n }, {\n noResponse: true,\n longPoll: true\n }).then(() => {\n this.longPollPending = undefined;\n setTimeout(this.checkLongPoll, 0);\n }, (error: ErrorEvent) => {\n this.log('Long-poll failed', error);\n }).finally(() => {\n this.sendingLongPoll = undefined;\n });\n }\n\n private checkConnection = (event: Event | string) => {\n this.debug && this.log('Check connection', event);\n this.clearCheckConnectionTimeout();\n\n if(!this.transport) {\n this.log.warn('No transport for checkConnection');\n return;\n }\n \n const serializer = new TLSerialization({mtproto: true});\n const pingId = randomLong();\n \n serializer.storeMethod('ping', {\n ping_id: pingId\n });\n \n const pingMessage = {\n msg_id: timeManager.generateId(),\n seq_no: this.generateSeqNo(true),\n body: serializer.getBytes(true)\n };\n\n if(this.offline) {\n this.setConnectionStatus(ConnectionStatus.Connecting);\n }\n\n this.sendEncryptedRequest(pingMessage).then(() => {\n this.toggleOffline(false);\n }, () => {\n this.debug && this.log('Delay', this.checkConnectionPeriod * 1000);\n this.checkConnectionTimeout = ctx.setTimeout(() => this.checkConnection('from failed checkConnection request'), this.checkConnectionPeriod * 1000 | 0);\n this.checkConnectionPeriod = Math.min(60, this.checkConnectionPeriod * 1.5);\n });\n };\n\n private clearCheckConnectionTimeout() {\n if(this.checkConnectionTimeout !== undefined) {\n clearTimeout(this.checkConnectionTimeout);\n this.checkConnectionTimeout = undefined;\n }\n }\n\n private toggleOffline(offline: boolean) {\n if(this.offline !== offline) {\n this.offline = offline;\n\n this.clearCheckConnectionTimeout();\n if(offline) {\n clearTimeout(this.nextReqTimeout);\n this.nextReqTimeout = 0;\n this.nextReq = 0;\n \n if(this.checkConnectionPeriod < 1.5) {\n this.checkConnectionPeriod = 0;\n }\n \n const delay = this.checkConnectionPeriod * 1000 | 0;\n this.checkConnectionRetryAt = Date.now() + delay;\n this.setConnectionStatus(ConnectionStatus.Closed, this.checkConnectionRetryAt);\n this.checkConnectionTimeout = ctx.setTimeout(() => this.checkConnection('from toggleOfline'), delay);\n this.checkConnectionPeriod = Math.min(30, (1 + this.checkConnectionPeriod) * 1.5);\n \n \n \n \n \n } else {\n this.setConnectionStatus(ConnectionStatus.Connected);\n this.checkLongPoll();\n\n this.scheduleRequest();\n \n \n \n \n \n }\n }\n\n this.setConnectionStatus(offline ? ConnectionStatus.Closed : ConnectionStatus.Connected, offline ? this.checkConnectionRetryAt : undefined);\n }\n\n private handleSentEncryptedRequestHTTP(promise: ReturnType<MTPNetworker['sendEncryptedRequest']>, message: MTMessage, noResponseMsgs: string[]) {\n // let timeout = setTimeout(() => {\n // this.log.error('handleSentEncryptedRequestHTTP timeout', promise, message, noResponseMsgs);\n // }, 5e3);\n\n promise.then((result) => {\n this.toggleOffline(false);\n // this.log('parse for', message);\n return this.parseResponse(result).then((response) => {\n this.debug && this.log.debug('Server response', response);\n \n this.processMessage(response.response, response.messageId, response.sessionId);\n\n this.checkLongPoll();\n this.checkConnectionPeriod = Math.max(1.1, Math.sqrt(this.checkConnectionPeriod));\n\n return true;\n });\n }, (error) => {\n this.log.error('Encrypted request failed', error, message);\n \n this.pushResend(message.msg_id);\n this.toggleOffline(true);\n\n return false;\n }).then((shouldResolve) => {\n // clearTimeout(timeout);\n noResponseMsgs.forEach((msgId) => {\n if(this.sentMessages[msgId]) {\n const deferred = this.sentMessages[msgId].deferred;\n delete this.sentMessages[msgId];\n delete this.pendingMessages[msgId];\n shouldResolve ? deferred.resolve() : deferred.reject();\n }\n });\n });\n }\n \n\n // тут можно сделать таймаут и выводить дисконнект\n private pushMessage(message: {\n msg_id: string,\n seq_no: number,\n body: Uint8Array | number[],\n isAPI?: boolean\n }, options: MTMessageOptions) {\n const promise = new Promise((resolve, reject) => {\n this.sentMessages[message.msg_id] = Object.assign(message, options, options.notContentRelated \n ? undefined \n : {\n deferred: {resolve, reject}\n }\n );\n\n //this.log.error('Networker pushMessage:', this.sentMessages[message.msg_id]);\n\n this.pendingMessages[message.msg_id] = 0;\n \n if(!options.noSchedule) {\n this.scheduleRequest();\n }\n\n if(isObject(options)) {\n options.messageId = message.msg_id;\n }\n });\n\n if(!options.notContentRelated && !options.noResponse) {\n const timeout = setTimeout(() => {\n if(this.lastResponseTime && (Date.now() - this.lastResponseTime) < CONNECTION_TIMEOUT) {\n return;\n }\n\n this.log.error('timeout', message);\n if(this.isOnline) {\n this.setConnectionStatus(ConnectionStatus.TimedOut);\n }\n\n /* this.getEncryptedOutput(message).then(bytes => {\n this.log.error('timeout encrypted', bytes);\n }); */\n }, CONNECTION_TIMEOUT);\n \n promise.catch(noop).finally(() => {\n clearTimeout(timeout);\n this.setConnectionStatus(ConnectionStatus.Connected);\n\n --this.activeRequests;\n this.setDrainTimeout();\n });\n \n ++this.activeRequests;\n if(this.onDrainTimeout !== undefined) {\n clearTimeout(this.onDrainTimeout);\n this.onDrainTimeout = undefined;\n }\n }\n\n return promise;\n }\n\n public setDrainTimeout() {\n if(!this.activeRequests && this.onDrain && this.onDrainTimeout === undefined) {\n this.onDrainTimeout = ctx.setTimeout(() => {\n this.onDrainTimeout = undefined;\n this.log('drain');\n this.onDrain();\n }, DRAIN_TIMEOUT);\n }\n }\n\n public setConnectionStatus(status: ConnectionStatus, retryAt?: number) {\n const isOnline = status === ConnectionStatus.Connected;\n const willChange = this.status !== status;\n this.isOnline = isOnline;\n this.status = status;\n\n if(willChange) {\n if(networkerFactory.onConnectionStatusChange) {\n networkerFactory.onConnectionStatusChange({\n _: 'networkerStatus',\n status,\n dcId: this.dcId,\n name: this.name,\n isFileNetworker: this.isFileNetworker,\n isFileDownload: this.isFileDownload,\n isFileUpload: this.isFileUpload,\n retryAt\n });\n }\n\n if(this.isOnline) {\n this.scheduleRequest();\n }\n\n // if((this.transport as TcpObfuscated).networker) {\n // this.sendPingDelayDisconnect();\n // }\n /* this.sentPingTimes = 0;\n this.sendPingDelayDisconnect(); */\n }\n /* if(this.onConnectionStatusChange) {\n this.onConnectionStatusChange(this.isOnline);\n } */\n }\n\n private pushResend(messageId: string, delay = 100) {\n const value = delay ? Date.now() + delay : 0;\n const sentMessage = this.sentMessages[messageId];\n if(sentMessage.container) {\n for(const innerMsgId of sentMessage.inner) {\n this.pendingMessages[innerMsgId] = value;\n }\n } else {\n this.pendingMessages[messageId] = value;\n }\n\n if(sentMessage.acked) {\n this.log.error('pushResend: acked message?', sentMessage);\n }\n \n if(this.debug) {\n this.log.debug('pushResend:', messageId, sentMessage, this.pendingMessages, delay);\n }\n \n this.scheduleRequest(delay);\n }\n\n // * correct, fully checked\n private async getMsgKey(dataWithPadding: Uint8Array, isOut: boolean) {\n const x = isOut ? 0 : 8;\n const msgKeyLargePlain = bufferConcats(this.authKeyUint8.subarray(88 + x, 88 + x + 32), dataWithPadding);\n\n const msgKeyLarge = await CryptoWorker.invokeCrypto('sha256-hash', msgKeyLargePlain);\n const msgKey = new Uint8Array(msgKeyLarge).subarray(8, 24);\n return msgKey;\n };\n\n // * correct, fully checked\n private getAesKeyIv(msgKey: Uint8Array, isOut: boolean): Promise<[Uint8Array, Uint8Array]> {\n const x = isOut ? 0 : 8;\n const sha2aText = new Uint8Array(52);\n const sha2bText = new Uint8Array(52);\n const promises: Array<Promise<Uint8Array>> = [];\n \n sha2aText.set(msgKey, 0);\n sha2aText.set(this.authKeyUint8.subarray(x, x + 36), 16);\n promises.push(CryptoWorker.invokeCrypto('sha256-hash', sha2aText));\n \n sha2bText.set(this.authKeyUint8.subarray(40 + x, 40 + x + 36), 0);\n sha2bText.set(msgKey, 36);\n promises.push(CryptoWorker.invokeCrypto('sha256-hash', sha2bText));\n\n return Promise.all(promises).then((results) => {\n const aesKey = new Uint8Array(32);\n const aesIv = new Uint8Array(32);\n const sha2a = new Uint8Array(results[0]);\n const sha2b = new Uint8Array(results[1]);\n \n aesKey.set(sha2a.subarray(0, 8));\n aesKey.set(sha2b.subarray(8, 24), 8);\n aesKey.set(sha2a.subarray(24, 32), 24);\n \n aesIv.set(sha2b.subarray(0, 8));\n aesIv.set(sha2a.subarray(8, 24), 8);\n aesIv.set(sha2b.subarray(24, 32), 24);\n \n return [aesKey, aesIv];\n });\n }\n\n public isStopped() {\n return networkerFactory.akStopped && !this.isFileNetworker;\n }\n\n private performScheduledRequest() {\n // this.log('scheduled', this.dcId, this.iii)\n\n if(this.isStopped()) {\n return false;\n }\n\n if(this.pendingAcks.length) {\n const ackMsgIds = this.pendingAcks.slice();\n\n // this.log('acking messages', ackMsgIDs)\n this.wrapMtpMessage({\n _: 'msgs_ack',\n msg_ids: ackMsgIds\n }, {\n notContentRelated: true,\n noSchedule: true\n });\n }\n \n if(this.pendingResends.length) {\n const resendMsgIds = this.pendingResends.slice();\n const resendOpts: MTMessageOptions = {\n noSchedule: true,\n notContentRelated: true,\n messageId: '' // will set in wrapMtpMessage->pushMessage\n };\n\n //this.log('resendReq messages', resendMsgIds);\n this.wrapMtpMessage({\n _: 'msg_resend_req',\n msg_ids: resendMsgIds\n }, resendOpts);\n\n this.lastResendReq = {\n req_msg_id: resendOpts.messageId,\n resend_msg_ids: resendMsgIds\n };\n }\n \n let outMessage: MTPNetworker['sentMessages'][keyof MTPNetworker['sentMessages']];\n const messages: typeof outMessage[] = [];\n \n //const currentTime = Date.now();\n let messagesByteLen = 0;\n\n \n let hasApiCall = false;\n let hasHttpWait = false;\n \n\n let lengthOverflow = false;\n\n // * Сюда никогда не попадут контейнеры, так как их не будет в pendingMessages\n const keys = sortLongsArray(Object.keys(this.pendingMessages));\n for(const messageId of keys) {\n //const value = this.pendingMessages[messageId];\n\n //if(!value || value <= currentTime) {\n const message = this.sentMessages[messageId];\n if(message && message.body) {\n /* if(message.fileUpload) {\n this.log('performScheduledRequest message:', message, message.body.length, (message.body as Uint8Array).byteLength, (message.body as Uint8Array).buffer.byteLength);\n } */\n\n const messageByteLength = message.body.length + 32;\n\n if((messagesByteLen + messageByteLength) > 655360) { // 640 Kb\n this.log.warn('lengthOverflow', message, messages);\n lengthOverflow = true;\n\n if(outMessage) { // if it's not a first message\n break;\n }\n }\n\n messages.push(message);\n messagesByteLen += messageByteLength;\n\n \n if(message.isAPI) {\n hasApiCall = true;\n } else if(message.longPoll) {\n hasHttpWait = true;\n }\n \n\n outMessage = message;\n } else {\n // this.log(message, messageId)\n }\n\n delete this.pendingMessages[messageId];\n //}\n }\n \n \n \n if(this.transport instanceof HTTP)\n \n if(hasApiCall && !hasHttpWait) {\n const serializer = new TLSerialization({mtproto: true});\n serializer.storeMethod('http_wait', {\n max_delay: 500,\n wait_after: 150,\n max_wait: 3000\n });\n\n messages.push({\n msg_id: timeManager.generateId(),\n seq_no: this.generateSeqNo(),\n body: serializer.getBytes(true)\n });\n }\n \n \n if(!messages.length) {\n // this.log('no scheduled messages')\n return;\n }\n \n \n const noResponseMsgs: Array<string> = messages.filter(message => message.noResponse).map(message => message.msg_id);\n \n \n if(messages.length > 1) {\n const container = this.generateContainerMessage(messagesByteLen, messages);\n outMessage = container.messageWithBody;\n \n this.sentMessages[outMessage.msg_id] = container.message;\n } else {\n this.sentMessages[outMessage.msg_id] = outMessage;\n }\n \n this.pendingAcks = [];\n\n const promise = this.sendEncryptedRequest(outMessage);\n\n \n \n if(this.transport instanceof HTTP)\n \n this.handleSentEncryptedRequestHTTP(promise, outMessage, noResponseMsgs);\n \n\n \n \n if(!(this.transport instanceof HTTP))\n \n this.cleanupSent(); // ! WARNING\n \n \n if(lengthOverflow) {\n this.scheduleRequest();\n }\n }\n\n private generateContainerMessage(messagesByteLen: number, messages: MTMessage[]) {\n const container = new TLSerialization({\n mtproto: true,\n startMaxLength: messagesByteLen + 64\n });\n\n container.storeInt(0x73f1f8dc, 'CONTAINER[id]');\n container.storeInt(messages.length, 'CONTAINER[count]');\n\n const innerMessages: string[] = [];\n messages.forEach((message, i) => {\n innerMessages.push(message.msg_id);\n // this.log('Pushing to container:', message.msg_id);\n container.storeLong(message.msg_id, 'CONTAINER[' + i + '][msg_id]');\n container.storeInt(message.seq_no, 'CONTAINER[' + i + '][seq_no]');\n container.storeInt(message.body.length, 'CONTAINER[' + i + '][bytes]');\n container.storeRawBytes(message.body, 'CONTAINER[' + i + '][body]');\n });\n\n const message: MTMessage = {\n msg_id: timeManager.generateId(),\n seq_no: this.generateSeqNo(true),\n container: true,\n inner: innerMessages\n };\n\n if(Modes.debug/* || true */) {\n this.log.warn('Container', innerMessages, message.msg_id, message.seq_no);\n }\n\n return {\n message,\n messageWithBody: Object.assign({body: container.getBytes(true)}, message),\n };\n }\n\n private async getEncryptedMessage(dataWithPadding: Uint8Array) {\n const msgKey = await this.getMsgKey(dataWithPadding, true);\n const keyIv = await this.getAesKeyIv(msgKey, true);\n // this.log('after msg key iv')\n\n const encryptedBytes = await CryptoWorker.invokeCrypto('aes-encrypt', dataWithPadding, keyIv[0], keyIv[1]);\n // this.log('Finish encrypt')\n\n return {\n bytes: encryptedBytes,\n msgKey\n };\n }\n\n private getDecryptedMessage(msgKey: Uint8Array, encryptedData: Uint8Array) {\n // this.log('get decrypted start')\n return this.getAesKeyIv(msgKey, false).then((keyIv) => {\n // this.log('after msg key iv')\n return CryptoWorker.invokeCrypto('aes-decrypt', encryptedData, keyIv[0], keyIv[1]);\n });\n }\n\n private getEncryptedOutput(message: MTMessage) {\n /* if(DEBUG) {\n this.log.debug('Send encrypted', message, this.authKeyId);\n } */\n /* if(!this.isOnline) {\n this.log('trying to send message when offline:', Object.assign({}, message));\n //debugger;\n } */\n\n const data = new TLSerialization({\n startMaxLength: message.body.length + 2048\n });\n\n data.storeIntBytes(this.serverSalt, 64, 'salt');\n data.storeIntBytes(this.sessionId, 64, 'session_id');\n \n data.storeLong(message.msg_id, 'message_id');\n data.storeInt(message.seq_no, 'seq_no');\n\n data.storeInt(message.body.length, 'message_data_length');\n data.storeRawBytes(message.body, 'message_data');\n\n /* const des = new TLDeserialization(data.getBuffer().slice(16));\n const desSalt = des.fetchLong();\n const desSessionId = des.fetchLong();\n\n if(!this.isOnline) {\n this.log.error('trying to send message when offline', message, new Uint8Array(des.buffer), desSalt, desSessionId);\n } */\n\n /* const messageDataLength = message.body.length;\n let canBeLength = 0; // bytes\n canBeLength += 8;\n canBeLength += 8;\n canBeLength += 8;\n canBeLength += 4;\n canBeLength += 4;\n canBeLength += message.body.length; */\n \n const dataBuffer = data.getBuffer();\n\n /* if(dataBuffer.byteLength !== canBeLength || !bytesCmp(new Uint8Array(dataBuffer.slice(dataBuffer.byteLength - message.body.length)), new Uint8Array(message.body))) {\n this.log.error('wrong length', dataBuffer, canBeLength, message.msg_id);\n } */\n\n const paddingLength = (16 - (data.getOffset() % 16)) + 16 * (1 + nextRandomUint(8) % 5);\n const padding = /* (message as any).padding || */new Uint8Array(paddingLength).randomize()/* .fill(0) */;\n /* const padding = [167, 148, 207, 226, 86, 192, 193, 57, 124, 153, 174, 145, 159, 1, 5, 70, 127, 157, \n 51, 241, 46, 85, 141, 212, 139, 234, 213, 164, 197, 116, 245, 70, 184, 40, 40, 201, 233, 211, 150, \n 94, 57, 84, 1, 135, 108, 253, 34, 139, 222, 208, 71, 214, 90, 67, 36, 28, 167, 148, 207, 226, 86, 192, 193, 57, 124, 153, 174, 145, 159, 1, 5, 70, 127, 157, \n 51, 241, 46, 85, 141, 212, 139, 234, 213, 164, 197, 116, 245, 70, 184, 40, 40, 201, 233, 211, 150, \n 94, 57, 84, 1, 135, 108, 253, 34, 139, 222, 208, 71, 214, 90, 67, 36, 28].slice(0, paddingLength); */\n\n //(message as any).padding = padding;\n\n const dataWithPadding = bufferConcats(dataBuffer, padding);\n // this.log('Adding padding', dataBuffer, padding, dataWithPadding)\n // this.log('auth_key_id', bytesToHex(self.authKeyID))\n\n /* if(dataWithPadding.byteLength % 16) {\n this.log.error('aaa', dataWithPadding, paddingLength);\n }\n\n if(message.fileUpload) {\n this.log('Send encrypted: body length:', (message.body as ArrayBuffer).byteLength, paddingLength, dataWithPadding);\n } */\n\n // * full next block is correct\n return this.getEncryptedMessage(dataWithPadding).then((encryptedResult) => {\n /* if(DEBUG) {\n this.log('Got encrypted out message', encryptedResult);\n } */\n\n const request = new TLSerialization({\n startMaxLength: encryptedResult.bytes.length + 256\n });\n request.storeIntBytes(this.authKeyId, 64, 'auth_key_id');\n request.storeIntBytes(encryptedResult.msgKey, 128, 'msg_key');\n request.storeRawBytes(encryptedResult.bytes, 'encrypted_data');\n \n const requestData = request.getBytes(true);\n\n // if(this.isFileNetworker) {\n // //this.log('Send encrypted: requestData length:', requestData.length, requestData.length % 16, paddingLength % 16, paddingLength, data.offset, encryptedResult.msgKey.length % 16, encryptedResult.bytes.length % 16);\n // //this.log('Send encrypted: messageId:', message.msg_id, requestData.length);\n // //this.log('Send encrypted:', message, new Uint8Array(bufferConcat(des.buffer, padding)), requestData, this.serverSalt.hex, this.sessionId.hex/* new Uint8Array(des.buffer) */);\n // this.debugRequests.push({before: new Uint8Array(bufferConcat(des.buffer, padding)), after: requestData});\n // }\n\n return requestData;\n });\n }\n\n private sendEncryptedRequest(message: MTMessage) {\n return this.getEncryptedOutput(message).then(requestData => {\n this.debug && this.log.debug('sendEncryptedRequest: launching message into space:', message, [message.msg_id].concat(message.inner || []), requestData.length);\n const promise: Promise<Uint8Array> = this.transport.send(requestData) as any;\n // this.debug && this.log.debug('sendEncryptedRequest: launched message into space:', message, promise);\n \n \n \n \n \n \n if(!(this.transport instanceof HTTP)) return promise;\n \n \n const baseError = {\n code: 406,\n type: 'NETWORK_BAD_RESPONSE',\n transport: this.transport\n };\n \n return promise.then((result) => {\n if(!result?.byteLength) {\n throw baseError;\n }\n \n // this.debug && this.log.debug('sendEncryptedRequest: got response for:', message, [message.msg_id].concat(message.inner || []));\n return result;\n }, (error) => {\n if(!error.message && !error.type) {\n error = Object.assign(baseError, {\n type: 'NETWORK_BAD_REQUEST',\n originalError: error\n });\n }\n\n throw error;\n });\n \n });\n }\n\n public parseResponse(responseBuffer: Uint8Array) {\n //const perf = performance.now();\n /* if(this.debug) {\n this.log.debug('Start parsing response', responseBuffer);\n } */\n\n this.lastResponseTime = Date.now();\n\n const deserializer = new TLDeserialization(responseBuffer);\n \n const authKeyId = deserializer.fetchIntBytes(64, true, 'auth_key_id');\n if(!bytesCmp(authKeyId, this.authKeyId)) {\n throw new Error('[MT] Invalid server auth_key_id: ' + authKeyId.hex);\n }\n\n const msgKey = deserializer.fetchIntBytes(128, true, 'msg_key');\n const encryptedData = deserializer.fetchRawBytes(responseBuffer.byteLength - deserializer.getOffset(), true, 'encrypted_data');\n \n return this.getDecryptedMessage(msgKey, encryptedData).then((dataWithPadding) => {\n // this.log('after decrypt')\n return this.getMsgKey(dataWithPadding, false).then((calcMsgKey) => {\n if(!bytesCmp(msgKey, calcMsgKey)) {\n this.log.warn('[MT] msg_keys', msgKey, calcMsgKey);\n this.updateSession(); // fix 28.01.2020\n throw new Error('[MT] server msgKey mismatch, updating session');\n }\n // this.log('after msgKey check')\n \n let deserializer = new TLDeserialization<MTLong>(dataWithPadding, {mtproto: true});\n \n /* const salt = */deserializer.fetchIntBytes(64, true, 'salt'); // need\n const sessionId = deserializer.fetchIntBytes(64, true, 'session_id');\n const messageId = deserializer.fetchLong('message_id');\n \n if(!bytesCmp(sessionId, this.sessionId) &&\n (!this.prevSessionId || !bytesCmp(sessionId, this.prevSessionId))) {\n this.log.warn('Sessions', sessionId, this.sessionId, this.prevSessionId, dataWithPadding);\n //this.updateSession();\n //this.sessionID = sessionID;\n throw new Error('[MT] Invalid server session_id: ' + bytesToHex(sessionId));\n }\n \n const seqNo = deserializer.fetchInt('seq_no');\n \n const totalLength = dataWithPadding.byteLength;\n \n const messageBodyLength = deserializer.fetchInt('message_data[length]');\n let offset = deserializer.getOffset();\n \n if((messageBodyLength % 4) ||\n messageBodyLength > totalLength - offset) {\n throw new Error('[MT] Invalid body length: ' + messageBodyLength);\n }\n const messageBody = deserializer.fetchRawBytes(messageBodyLength, true, 'message_data');\n \n offset = deserializer.getOffset();\n const paddingLength = totalLength - offset;\n if(paddingLength < 12 || paddingLength > 1024) {\n throw new Error('[MT] Invalid padding length: ' + paddingLength);\n }\n \n //let buffer = bytesToArrayBuffer(messageBody);\n deserializer = new TLDeserialization<MTLong>(/* buffer */messageBody, {\n mtproto: true, \n override: {\n mt_message: (result: any, field: string) => {\n result.msg_id = deserializer.fetchLong(field + '[msg_id]');\n result.seqno = deserializer.fetchInt(field + '[seqno]');\n result.bytes = deserializer.fetchInt(field + '[bytes]');\n \n const offset = deserializer.getOffset();\n \n //self.log('mt_message!!!!!', result, field);\n \n try {\n result.body = deserializer.fetchObject('Object', field + '[body]');\n } catch(e) {\n this.log.error('parse error', (e as Error).message, (e as Error).stack);\n result.body = {\n _: 'parse_error',\n error: e\n };\n }\n\n if(deserializer.getOffset() !== offset + result.bytes) {\n // console.warn(dT(), 'set offset', this.offset, offset, result.bytes)\n // this.log(result)\n deserializer.setOffset(offset + result.bytes);\n }\n // this.log('override message', result)\n },\n mt_rpc_result: (result: any, field: any) => {\n result.req_msg_id = deserializer.fetchLong(field + '[req_msg_id]');\n \n const sentMessage = this.sentMessages[result.req_msg_id];\n const type = sentMessage && sentMessage.resultType || 'Object';\n \n if(result.req_msg_id && !sentMessage) {\n // console.warn(dT(), 'Result for unknown message', result);\n return;\n }\n \n result.result = deserializer.fetchObject(type, field + '[result]');\n // self.log(dT(), 'override rpc_result', sentMessage, type, result);\n }\n }\n });\n\n const response = deserializer.fetchObject('', 'INPUT');\n //this.log.error('Parse response time:', performance.now() - perf);\n return {\n response,\n messageId,\n sessionId,\n seqNo\n };\n });\n });\n }\n\n private applyServerSalt(newServerSalt: string) {\n const serverSalt = longToBytes(newServerSalt);\n \n sessionStorage.set({\n ['dc' + this.dcId + '_server_salt']: bytesToHex(serverSalt)\n });\n \n this.serverSalt = new Uint8Array(serverSalt);\n }\n\n // ! таймаут очень сильно тормозит скорость работы сокета (даже нулевой) \n public scheduleRequest(delay?: number) {\n /* if(!this.isOnline) {\n return;\n } */\n\n \n \n if(this.transport instanceof HTTP) {\n \n if(this.offline) {\n this.checkConnection('forced schedule');\n }\n\n delay ||= 0; // set zero timeout to pack other messages too\n \n }\n \n \n\n const nextReq = Date.now() + (delay || 0);\n if(this.nextReq && (delay === undefined || this.nextReq <= nextReq)) {\n //this.debug && this.log('scheduleRequest: nextReq', this.nextReq, nextReq);\n return;\n }\n \n //this.debug && this.log('scheduleRequest: delay', delay);\n\n /* if(this.nextReqTimeout) {\n return;\n } */\n \n //const perf = performance.now();\n if(this.nextReqTimeout) {\n clearTimeout(this.nextReqTimeout);\n }\n\n const cb = () => {\n //this.debug && this.log('scheduleRequest: timeout delay was:', performance.now() - perf);\n\n this.nextReqTimeout = 0;\n this.nextReq = 0;\n\n \n \n if(this.transport instanceof HTTP)\n \n if(this.offline) {\n //this.log('Cancel scheduled');\n return;\n }\n \n\n this.performScheduledRequest();\n };\n\n this.nextReq = nextReq;\n\n if(delay !== undefined) {\n this.nextReqTimeout = self.setTimeout(cb, delay);\n } else {\n cb();\n }\n }\n\n private ackMessage(msgId: MTLong) {\n // this.log('ack message', msgID)\n this.pendingAcks.push(msgId);\n\n let delay: number;\n\n \n \n if(this.transport instanceof HTTP)\n \n delay = 30000;\n \n\n this.scheduleRequest(delay);\n }\n \n private reqResendMessage(msgId: MTLong) {\n if(this.debug) {\n this.log.debug('Req resend', msgId);\n }\n\n this.pendingResends.push(msgId);\n this.scheduleRequest(100);\n }\n\n public cleanupSent() {\n let notEmpty = false;\n // this.log('clean start', this.dcId/*, this.sentMessages*/)\n Object.keys(this.sentMessages).forEach((msgId) => {\n const message = this.sentMessages[msgId];\n \n // this.log('clean iter', msgID, message)\n if(message.notContentRelated && this.pendingMessages[msgId] === undefined) {\n // this.log('clean notContentRelated', msgID)\n delete this.sentMessages[msgId];\n } else if(message.container) {\n for(const innerMsgId of message.inner) {\n if(this.sentMessages[innerMsgId] !== undefined) {\n // this.log('clean failed, found', msgID, message.inner[i], this.sentMessages[message.inner[i]].seq_no)\n notEmpty = true;\n return;\n }\n }\n // this.log('clean container', msgID)\n delete this.sentMessages[msgId];\n } else {\n notEmpty = true;\n }\n });\n \n return !notEmpty;\n }\n\n private processMessageAck(messageId: Long) {\n const sentMessage = this.sentMessages[messageId];\n if(sentMessage && !sentMessage.acked) {\n //delete sentMessage.body;\n sentMessage.acked = true;\n }\n }\n\n private processError(rawError: {error_message: string, error_code: number}) {\n const matches = (rawError.error_message || '').match(/^([A-Z_0-9]+\\b)(: (.+))?/) || [];\n rawError.error_code = rawError.error_code;\n \n return {\n code: !rawError.error_code || rawError.error_code <= 0 ? 500 : rawError.error_code,\n type: matches[1] || 'UNKNOWN',\n description: matches[3] || ('CODE#' + rawError.error_code + ' ' + rawError.error_message),\n originalError: rawError\n };\n }\n\n /**\n * * только для сокета\n * TODO: consider about containers resend\n */\n public resend() {\n for(const id in this.sentMessages) {\n const msg = this.sentMessages[id];\n if(msg.body || msg.container) {\n this.pushResend(id);\n }\n }\n }\n\n /* public requestMessageStatus() {\n const ids: string[] = [];\n for(const id in this.sentMessages) {\n const message = this.sentMessages[id];\n if(message.isAPI && message.fileUpload) {\n ids.push(message.msg_id);\n }\n }\n\n this.wrapMtpMessage({\n _: 'msgs_state_req',\n msg_ids: ids\n }, {\n notContentRelated: true\n }).then(res => {\n this.log('status', res);\n });\n } */\n\n // * https://core.telegram.org/mtproto/service_messages_about_messages#notice-of-ignored-error-message\n public processMessage(message: any, messageId: MTLong, sessionId: Uint8Array | number[]) {\n if(message._ === 'messageEmpty') {\n this.log.warn('processMessage: messageEmpty', message, messageId);\n return;\n }\n\n // messageId = messageId.toString();\n\n const msgidInt = parseInt(messageId.substr(0, -10), 10);\n if(msgidInt % 2) {\n this.log.warn('Server even message id: ', messageId, message);\n return;\n }\n\n /* if(this.debug) {\n this.log('process message', message, messageId, sessionId);\n } */\n\n switch(message._) {\n case 'msg_container': {\n for(const innerMessage of message.messages) {\n this.processMessage(innerMessage, innerMessage.msg_id, sessionId);\n }\n\n break;\n }\n \n case 'bad_server_salt': {\n this.log('Bad server salt', message);\n\n this.applyServerSalt(message.new_server_salt);\n\n if(this.sentMessages[message.bad_msg_id]) {\n this.pushResend(message.bad_msg_id);\n }\n \n this.ackMessage(messageId);\n \n // simulate disconnect\n /* try {\n this.log('networker state:', this);\n // @ts-ignore\n this.transport.ws.close(1000);\n } catch(err) {\n this.log.error('transport', this.transport, err);\n } */\n\n break;\n }\n \n case 'bad_msg_notification': {\n this.log.error('Bad msg notification', message);\n\n switch(message.error_code) {\n case 16: // * msg_id too low\n case 17: // * msg_id too high\n case 32: // * msg_seqno too low\n case 33: // * msg_seqno too high\n case 64: { // * invalid container\n //const changedOffset = timeManager.applyServerTime(bigStringInt(messageId).shiftRight(32).toString(10));\n const bigInt = str2bigInt(messageId, 10);\n rightShift_(bigInt, 32);\n const changedOffset = timeManager.applyServerTime(+bigInt2str(bigInt, 10));\n if(message.error_code === 17 || changedOffset) {\n this.log('Update session');\n this.updateSession();\n }\n\n const badMessage = this.updateSentMessage(message.bad_msg_id);\n if(badMessage) this.pushResend(badMessage.msg_id); // fix 23.01.2020\n //this.ackMessage(messageId);\n }\n\n // * invalid container\n /* case 64: {\n const badMessage = this.sentMessages[message.bad_msg_id];\n if(badMessage) {\n for(const msgId of badMessage.inner) {\n if(this.sentMessages[msgId] !== undefined) {\n this.updateSentMessage\n }\n }\n const inner = badMessage.inner;\n }\n } */\n }\n\n break;\n }\n \n case 'message': {\n if(this.lastServerMessages.indexOf(messageId) !== -1) {\n // console.warn('[MT] Server same messageId: ', messageId)\n this.ackMessage(messageId);\n return;\n }\n\n this.lastServerMessages.push(messageId);\n if(this.lastServerMessages.length > 100) {\n this.lastServerMessages.shift();\n }\n\n this.processMessage(message.body, message.msg_id, sessionId);\n break;\n }\n \n case 'new_session_created': {\n this.ackMessage(messageId);\n\n if(this.debug) {\n this.log.debug('new_session_created', message);\n }\n //this.updateSession();\n \n this.processMessageAck(message.first_msg_id);\n this.applyServerSalt(message.server_salt);\n \n sessionStorage.get('dc').then((baseDcId) => {\n if(baseDcId === this.dcId && !this.isFileNetworker && networkerFactory.updatesProcessor) {\n networkerFactory.updatesProcessor(message);\n }\n });\n break;\n }\n \n case 'msgs_ack': {\n for(const msgId of message.msg_ids) {\n this.processMessageAck(msgId);\n }\n\n break;\n }\n \n case 'msg_detailed_info':\n if(!this.sentMessages[message.msg_id]) {\n this.ackMessage(message.answer_msg_id);\n break;\n }\n case 'msg_new_detailed_info':\n if(this.pendingAcks.indexOf(message.answer_msg_id)) {\n break;\n }\n this.reqResendMessage(message.answer_msg_id);\n break;\n \n case 'msgs_state_info': {\n this.ackMessage(message.answer_msg_id);\n if(this.lastResendReq && \n this.lastResendReq.req_msg_id === message.req_msg_id && \n this.pendingResends.length\n ) {\n for(const badMsgId of this.lastResendReq.resend_msg_ids) {\n const pos = this.pendingResends.indexOf(badMsgId);\n if(pos !== -1) {\n this.pendingResends.splice(pos, 1);\n }\n }\n }\n\n break;\n }\n\n case 'rpc_result': {\n this.ackMessage(messageId);\n \n const sentMessageId = message.req_msg_id;\n const sentMessage = this.sentMessages[sentMessageId];\n\n this.processMessageAck(sentMessageId);\n if(sentMessage) {\n const deferred = sentMessage.deferred;\n if(message.result._ === 'rpc_error') {\n const error = this.processError(message.result);\n this.log('Rpc error', error);\n if(deferred) {\n deferred.reject(error);\n }\n } else {\n if(deferred) {\n /* if(DEBUG) {\n this.log.debug('Rpc response', message.result, sentMessage);\n } */\n\n deferred.resolve(message.result);\n }\n\n if(sentMessage.isAPI && !this.connectionInited) {\n this.connectionInited = true;\n ////this.log('Rpc set connectionInited to:', this.connectionInited);\n }\n }\n \n delete this.sentMessages[sentMessageId];\n } else {\n if(this.debug) {\n this.log('Rpc result for unknown message:', sentMessageId, message);\n }\n }\n\n break;\n }\n\n case 'pong': { // * https://core.telegram.org/mtproto/service_messages#ping-messages-pingpong - These messages don't require acknowledgments\n const sentMessageId = message.msg_id;\n const sentMessage = this.sentMessages[sentMessageId]; \n\n if(sentMessage) {\n sentMessage.deferred.resolve(message);\n delete this.sentMessages[sentMessageId];\n }\n\n break;\n }\n \n default:\n this.ackMessage(messageId);\n\n /* if(this.debug) {\n this.log.debug('Update', message);\n } */\n \n if(networkerFactory.updatesProcessor !== null) {\n networkerFactory.updatesProcessor(message);\n }\n break;\n }\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov <igor.beatle@gmail.com>\r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport type { ConnectionStatusChange } from \"./connectionStatus\";\r\nimport MTPNetworker from \"./networker\";\r\nimport { InvokeApiOptions } from \"../../types\";\r\nimport App from \"../../config/app\";\r\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\r\nimport { indexOfAndSplice } from \"../../helpers/array\";\r\n\r\nexport class NetworkerFactory {\r\n private networkers: MTPNetworker[] = [];\r\n public language = navigator.language || App.langPackCode;\r\n public updatesProcessor: (obj: any) => void = null;\r\n public onConnectionStatusChange: (info: ConnectionStatusChange) => void = null;\r\n public akStopped = false;\r\n public userAgent = navigator.userAgent;\r\n\r\n public removeNetworker(networker: MTPNetworker) {\r\n indexOfAndSplice(this.networkers, networker);\r\n }\r\n\r\n public setUpdatesProcessor(callback: (obj: any) => void) {\r\n this.updatesProcessor = callback;\r\n }\r\n\r\n public getNetworker(dcId: number, authKey: Uint8Array, authKeyId: Uint8Array, serverSalt: Uint8Array, options: InvokeApiOptions) {\r\n //console.log('NetworkerFactory: creating new instance of MTPNetworker:', dcId, options);\r\n const networker = new MTPNetworker(dcId, authKey, authKeyId, serverSalt, options);\r\n this.networkers.push(networker);\r\n return networker;\r\n }\r\n\r\n public startAll() {\r\n if(this.akStopped) {\r\n const stoppedNetworkers = this.networkers.filter(networker => networker.isStopped());\r\n\r\n this.akStopped = false;\r\n this.updatesProcessor && this.updatesProcessor({_: 'new_session_created'});\r\n \r\n for(const networker of stoppedNetworkers) {\r\n networker.scheduleRequest();\r\n }\r\n }\r\n }\r\n\r\n public stopAll() {\r\n this.akStopped = true;\r\n }\r\n\r\n public setLanguage(langCode: string) {\r\n this.language = langCode;\r\n for(const networker of this.networkers) {\r\n if(!networker.isFileNetworker) {\r\n networker.connectionInited = false;\r\n }\r\n }\r\n }\r\n\r\n public forceReconnectTimeout() {\r\n for(const networker of this.networkers) {\r\n networker.forceReconnectTimeout();\r\n }\r\n }\r\n\r\n public forceReconnect() {\r\n for(const networker of this.networkers) {\r\n if(!networker.isFileNetworker) {\r\n networker.forceReconnect();\r\n break;\r\n }\r\n }\r\n }\r\n}\r\n\r\nconst networkerFactory = new NetworkerFactory();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.networkerFactory = networkerFactory);\r\nexport default networkerFactory;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov <igor.beatle@gmail.com>\r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport { TLSerialization } from \"./tl_utils\";\r\nimport CryptoWorker from '../crypto/cryptoworker';\r\nimport { bytesFromHex, bytesToHex } from \"../../helpers/bytes\";\r\nimport { bigInt2str, str2bigInt } from \"../../vendor/leemon\";\r\nimport Modes from \"../../config/modes\";\r\n\r\nexport type RSAPublicKeyHex = {\r\n modulus: string,\r\n exponent: string\r\n};\r\n\r\nexport class RSAKeysManager {\r\n\r\n /**\r\n * Server public key, obtained from here: https://core.telegram.org/api/obtaining_api_id\r\n * \r\n * \r\n * -----BEGIN RSA PUBLIC KEY-----\r\n * MIIBCgKCAQEA6LszBcC1LGzyr992NzE0ieY+BSaOW622Aa9Bd4ZHLl+TuFQ4lo4g\r\n * 5nKaMBwK/BIb9xUfg0Q29/2mgIR6Zr9krM7HjuIcCzFvDtr+L0GQjae9H0pRB2OO\r\n * 62cECs5HKhT5DZ98K33vmWiLowc621dQuwKWSQKjWf50XYFw42h21P2KXUGyp2y/\r\n * +aEyZ+uVgLLQbRA1dEjSDZ2iGRy12Mk5gpYc397aYp438fsJoHIgJ2lgMv5h7WY9\r\n * t6N/byY9Nw9p21Og3AoXSL2q/2IJ1WRUhebgAdGVMlV1fkuOQoEzR7EdpqtQD9Cs\r\n * 5+bfo3Nhmcyvk5ftB0WkJ9z6bNZ7yxrP8wIDAQAB\r\n * -----END RSA PUBLIC KEY-----\r\n *\r\n * -----BEGIN RSA PUBLIC KEY-----\r\n * MIIBCgKCAQEBadMIUYSKhyznMh+Pg+OxTLyDZrWEjQIPZC3oJCtuZX7qUxgcWqFX\r\n * Q1952TSY8S8NYuz12sK9Fvp+lil1hIG0U/cuPsK08VB1hB4VA+p0S46fGwVsRovq\r\n * 4qUiUIzQSjSHDASuXTOinlYEHwmg/GaLc5G7qhePWa0p9YmqYR5Ha3xHJywcXZrn\r\n * yE3nC9igL96Aanqv+Prbu1N+r9vAgZeHh9cfbtbV8WWwruOANOTEv2ctQLR0dfr9\r\n * MwQXNePTPQlYsO9HNIGS1LWe7hZFtGBAVJH92F7Kig68WqHM3PIZ6Sq7N0VSzfzL\r\n * b11Z/YHz2UXYtXADwL/m5pTpKBUtJBXkOQIDAQAB\r\n * -----END RSA PUBLIC KEY-----\r\n *\r\n * Bytes can be got via \r\n * $ openssl rsa -in rsa.pem -RSAPublicKey_in -pubout > pub.pem\r\n * $ openssl rsa -pubin -in pub.pem -text -noout\r\n */\r\n\r\n /* private publisKeysHex = [{\r\n modulus: 'c150023e2f70db7985ded064759cfecf0af328e69a41daf4d6f01b538135a6f91f8f8b2a0ec9ba9720ce352efcf6c5680ffc424bd634864902de0b4bd6d49f4e580230e3ae97d95c8b19442b3c0a10d8f5633fecedd6926a7f6dab0ddb7d457f9ea81b8465fcd6fffeed114011df91c059caedaf97625f6c96ecc74725556934ef781d866b34f011fce4d835a090196e9a5f0e4449af7eb697ddb9076494ca5f81104a305b6dd27665722c46b60e5df680fb16b210607ef217652e60236c255f6a28315f4083a96791d7214bf64c1df4fd0db1944fb26a2a57031b32eee64ad15a8ba68885cde74a5bfc920f6abf59ba5c75506373e7130f9042da922179251f',\r\n exponent: '010001'\r\n }, {\r\n modulus: 'aeec36c8ffc109cb099624685b97815415657bd76d8c9c3e398103d7ad16c9bba6f525ed0412d7ae2c2de2b44e77d72cbf4b7438709a4e646a05c43427c7f184debf72947519680e651500890c6832796dd11f772c25ff8f576755afe055b0a3752c696eb7d8da0d8be1faf38c9bdd97ce0a77d3916230c4032167100edd0f9e7a3a9b602d04367b689536af0d64b613ccba7962939d3b57682beb6dae5b608130b2e52aca78ba023cf6ce806b1dc49c72cf928a7199d22e3d7ac84e47bc9427d0236945d10dbd15177bab413fbf0edfda09f014c7a7da088dde9759702ca760af2b8e4e97cc055c617bd74c3d97008635b98dc4d621b4891da9fb0473047927',\r\n exponent: '010001'\r\n }, {\r\n modulus: 'bdf2c77d81f6afd47bd30f29ac76e55adfe70e487e5e48297e5a9055c9c07d2b93b4ed3994d3eca5098bf18d978d54f8b7c713eb10247607e69af9ef44f38e28f8b439f257a11572945cc0406fe3f37bb92b79112db69eedf2dc71584a661638ea5becb9e23585074b80d57d9f5710dd30d2da940e0ada2f1b878397dc1a72b5ce2531b6f7dd158e09c828d03450ca0ff8a174deacebcaa22dde84ef66ad370f259d18af806638012da0ca4a70baa83d9c158f3552bc9158e69bf332a45809e1c36905a5caa12348dd57941a482131be7b2355a5f4635374f3bd3ddf5ff925bf4809ee27c1e67d9120c5fe08a9de458b1b4a3c5d0a428437f2beca81f4e2d5ff',\r\n exponent: '010001'\r\n }, {\r\n modulus: 'b3f762b739be98f343eb1921cf0148cfa27ff7af02b6471213fed9daa0098976e667750324f1abcea4c31e43b7d11f1579133f2b3d9fe27474e462058884e5e1b123be9cbbc6a443b2925c08520e7325e6f1a6d50e117eb61ea49d2534c8bb4d2ae4153fabe832b9edf4c5755fdd8b19940b81d1d96cf433d19e6a22968a85dc80f0312f596bd2530c1cfb28b5fe019ac9bc25cd9c2a5d8a0f3a1c0c79bcca524d315b5e21b5c26b46babe3d75d06d1cd33329ec782a0f22891ed1db42a1d6c0dea431428bc4d7aabdcf3e0eb6fda4e23eb7733e7727e9a1915580796c55188d2596d2665ad1182ba7abf15aaa5a8b779ea996317a20ae044b820bff35b6e8a1',\r\n exponent: '010001'\r\n }, {\r\n modulus: 'be6a71558ee577ff03023cfa17aab4e6c86383cff8a7ad38edb9fafe6f323f2d5106cbc8cafb83b869cffd1ccf121cd743d509e589e68765c96601e813dc5b9dfc4be415c7a6526132d0035ca33d6d6075d4f535122a1cdfe017041f1088d1419f65c8e5490ee613e16dbf662698c0f54870f0475fa893fc41eb55b08ff1ac211bc045ded31be27d12c96d8d3cfc6a7ae8aa50bf2ee0f30ed507cc2581e3dec56de94f5dc0a7abee0be990b893f2887bd2c6310a1e0a9e3e38bd34fded2541508dc102a9c9b4c95effd9dd2dfe96c29be647d6c69d66ca500843cfaed6e440196f1dbe0e2e22163c61ca48c79116fa77216726749a976a1c4b0944b5121e8c01',\r\n exponent: '010001'\r\n }]; */\r\n\r\n private testPublicKeysHex: RSAPublicKeyHex[] = [{\r\n modulus: 'c8c11d635691fac091dd9489aedced2932aa8a0bcefef05fa800892d9b52ed03200865c9e97211cb2ee6c7ae96d3fb0e15aeffd66019b44a08a240cfdd2868a85e1f54d6fa5deaa041f6941ddf302690d61dc476385c2fa655142353cb4e4b59f6e5b6584db76fe8b1370263246c010c93d011014113ebdf987d093f9d37c2be48352d69a1683f8f6e6c2167983c761e3ab169fde5daaa12123fa1beab621e4da5935e9c198f82f35eae583a99386d8110ea6bd1abb0f568759f62694419ea5f69847c43462abef858b4cb5edc84e7b9226cd7bd7e183aa974a712c079dde85b9dc063b8a5c08e8f859c0ee5dcd824c7807f20153361a7f63cfd2a433a1be7f5',\r\n exponent: '010001'\r\n }];\r\n\r\n private publisKeysHex: RSAPublicKeyHex[] = [{\r\n // modulus: '00e8bb3305c0b52c6cf2afdf7637313489e63e05268e5badb601af417786472e5f93b85438968e20e6729a301c0afc121bf7151f834436f7fda680847a66bf64accec78ee21c0b316f0edafe2f41908da7bd1f4a5107638eeb67040ace472a14f90d9f7c2b7def99688ba3073adb5750bb02964902a359fe745d8170e36876d4fd8a5d41b2a76cbff9a13267eb9580b2d06d10357448d20d9da2191cb5d8c93982961cdfdeda629e37f1fb09a0722027696032fe61ed663db7a37f6f263d370f69db53a0dc0a1748bdaaff6209d5645485e6e001d1953255757e4b8e42813347b11da6ab500fd0ace7e6dfa3736199ccaf9397ed0745a427dcfa6cd67bcb1acff3',\r\n modulus: 'e8bb3305c0b52c6cf2afdf7637313489e63e05268e5badb601af417786472e5f93b85438968e20e6729a301c0afc121bf7151f834436f7fda680847a66bf64accec78ee21c0b316f0edafe2f41908da7bd1f4a5107638eeb67040ace472a14f90d9f7c2b7def99688ba3073adb5750bb02964902a359fe745d8170e36876d4fd8a5d41b2a76cbff9a13267eb9580b2d06d10357448d20d9da2191cb5d8c93982961cdfdeda629e37f1fb09a0722027696032fe61ed663db7a37f6f263d370f69db53a0dc0a1748bdaaff6209d5645485e6e001d1953255757e4b8e42813347b11da6ab500fd0ace7e6dfa3736199ccaf9397ed0745a427dcfa6cd67bcb1acff3',\r\n exponent: '010001'\r\n }];\r\n\r\n private publicKeysParsed: {\r\n [hex: string]: RSAPublicKeyHex\r\n } = {};\r\n private prepared = false;\r\n private preparePromise: Promise<void> = null;\r\n\r\n constructor() {\r\n if(Modes.test) {\r\n this.publisKeysHex = this.testPublicKeysHex;\r\n }\r\n }\r\n\r\n public prepare(): Promise<void> {\r\n if(this.preparePromise) return this.preparePromise;\r\n else if(this.prepared) {\r\n return Promise.resolve();\r\n }\r\n\r\n return this.preparePromise = Promise.all(this.publisKeysHex.map(keyParsed => {\r\n const RSAPublicKey = new TLSerialization();\r\n RSAPublicKey.storeBytes(bytesFromHex(keyParsed.modulus), 'n');\r\n RSAPublicKey.storeBytes(bytesFromHex(keyParsed.exponent), 'e');\r\n\r\n const buffer = RSAPublicKey.getBuffer();\r\n\r\n return CryptoWorker.invokeCrypto('sha1-hash', buffer).then(bytes => {\r\n const fingerprintBytes = bytes.slice(-8);\r\n fingerprintBytes.reverse();\r\n \r\n this.publicKeysParsed[bytesToHex(fingerprintBytes).toLowerCase()] = {\r\n modulus: keyParsed.modulus,\r\n exponent: keyParsed.exponent\r\n };\r\n });\r\n })).then(() => {\r\n this.prepared = true;\r\n\r\n //console.log('[MT] Prepared keys');\r\n this.preparePromise = null;\r\n });\r\n }\r\n\r\n public async select(fingerprints: Array<string>) {\r\n await this.prepare();\r\n\r\n for(let i = 0; i < fingerprints.length; ++i) {\r\n //fingerprintHex = bigStringInt(fingerprints[i]).toString(16);\r\n let fingerprintHex = bigInt2str(str2bigInt(fingerprints[i], 10), 16).toLowerCase();\r\n\r\n if(fingerprintHex.length < 16) {\r\n fingerprintHex = new Array(16 - fingerprintHex.length).fill('0').join('') + fingerprintHex;\r\n }\r\n\r\n //console.log(fingerprintHex, this.publicKeysParsed);\r\n const foundKey = this.publicKeysParsed[fingerprintHex];\r\n if(foundKey) {\r\n return Object.assign({\r\n fingerprint: fingerprints[i]\r\n }, foundKey);\r\n }\r\n }\r\n }\r\n}\r\n\r\nexport default new RSAKeysManager();\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov <igor.beatle@gmail.com>\n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport { TLSerialization, TLDeserialization } from \"./tl_utils\";\nimport dcConfigurator, { TransportType } from \"./dcConfigurator\";\nimport rsaKeysManager from \"./rsaKeysManager\";\nimport timeManager from \"./timeManager\";\n\nimport CryptoWorker from \"../crypto/cryptoworker\";\n\nimport { logger, LogTypes } from \"../logger\";\nimport { bytesCmp, bytesToHex, bytesFromHex, bytesXor } from \"../../helpers/bytes\";\nimport DEBUG from \"../../config/debug\";\nimport { cmp, int2bigInt, one, pow, str2bigInt, sub } from \"../../vendor/leemon\";\nimport { addPadding } from \"./bin_utils\";\nimport { Awaited, DcId } from \"../../types\";\nimport { ApiError } from \"./apiManager\";\n\n \nimport transportController from \"./transports/controller\";\n \n\n/* let fNewNonce: any = bytesFromHex('8761970c24cb2329b5b2459752c502f3057cb7e8dbab200e526e8767fdc73b3c').reverse();\nlet fNonce: any = bytesFromHex('b597720d11faa5914ef485c529cde414').reverse();\nlet fResult: any = new Uint8Array(bytesFromHex('000000000000000001b473a0661b285e480000006324160514e4cd29c585f44e91a5fa110d7297b5c0c4134c84893db5715ecd56af5ed618082182053cc5de91cd00000015c4b51c02000000a5b7f709355fc30b216be86c022bb4c3'));\n\nfNewNonce = false;\nfNonce = false;\nfResult = false; */\n\ntype AuthOptions = {\n dcId: number,\n nonce: Uint8Array,\n \n serverNonce?: Uint8Array,\n pq?: Uint8Array,\n fingerprints?: string[],\n publicKey?: {\n modulus: string,\n exponent: string,\n fingerprint: string\n },\n \n // good\n p?: Uint8Array,\n q?: Uint8Array,\n \n newNonce?: Uint8Array,\n \n retry?: number,\n \n b?: Uint8Array,\n g?: number,\n gA?: Uint8Array,\n dhPrime?: Uint8Array,\n \n tmpAesKey?: Uint8Array,\n tmpAesIv?: Uint8Array,\n \n authKeyId?: Uint8Array,\n authKey?: Uint8Array,\n serverSalt?: Uint8Array,\n\n localTime?: number,\n serverTime?: any,\n};\n\ntype ResPQ = {\n _: 'resPQ';\n nonce: Uint8Array;\n pq: Uint8Array;\n server_nonce: Uint8Array;\n server_public_key_fingerprints: string[];\n};\n\ntype P_Q_inner_data = {\n _: 'p_q_inner_data_dc';\n pq: Uint8Array;\n p: Uint8Array;\n q: Uint8Array;\n nonce: Uint8Array;\n server_nonce: Uint8Array;\n new_nonce: Uint8Array;\n dc: number;\n};\n\ntype req_DH_params = {\n nonce: Uint8Array;\n server_nonce: Uint8Array;\n p: Uint8Array;\n q: Uint8Array;\n public_key_fingerprint: string;\n encrypted_data: Uint8Array;\n};\n\nexport class Authorizer {\n private cached: {\n [dcId: DcId]: Promise<AuthOptions>\n };\n \n private log: ReturnType<typeof logger>;\n\n private transportType: TransportType;\n\n \n private getTransportTypePromise: Promise<void>;\n \n \n constructor() {\n this.cached = {};\n this.log = logger(`AUTHORIZER`, LogTypes.Error | LogTypes.Log);\n }\n \n private sendPlainRequest(dcId: DcId, requestArray: Uint8Array) {\n const requestLength = requestArray.byteLength;\n \n const header = new TLSerialization();\n header.storeLongP(0, 0, 'auth_key_id');\n header.storeLong(timeManager.generateId(), 'msg_id');\n header.storeInt(requestLength, 'request_length');\n \n const headerArray = header.getBytes(true) as Uint8Array;\n const resultArray = new Uint8Array(headerArray.byteLength + requestLength);\n resultArray.set(headerArray);\n resultArray.set(requestArray, headerArray.length);\n\n const transport = dcConfigurator.chooseServer(dcId, 'client', this.transportType);\n const baseError = {\n code: 406,\n type: 'NETWORK_BAD_RESPONSE'\n };\n \n if(DEBUG) {\n this.log('mtpSendPlainRequest: creating requestPromise');\n }\n \n const promise = transport.send(resultArray) as any as Promise<Uint8Array>;\n return promise.then(result => {\n if(DEBUG) {\n this.log('mtpSendPlainRequest: in good sector', result);\n }\n \n if(!result || !result.byteLength) {\n throw baseError;\n }\n \n try {\n /* result = fResult ? fResult : result;\n fResult = new Uint8Array(0); */\n \n const deserializer = new TLDeserialization<MTLong>(result, {mtproto: true});\n\n if(result.length === 4) {\n const errorCode = deserializer.fetchInt();\n this.log.error('mtpSendPlainRequest: wrong response, error code:', errorCode);\n throw errorCode;\n }\n\n const auth_key_id = deserializer.fetchLong('auth_key_id');\n if(auth_key_id !== '0') this.log.error('auth_key_id !== 0', auth_key_id);\n \n const msg_id = deserializer.fetchLong('msg_id');\n if(msg_id === '0') this.log.error('msg_id === 0', msg_id);\n \n const msg_len = deserializer.fetchInt('msg_len');\n if(!msg_len) this.log.error('no msg_len', msg_len);\n \n return deserializer;\n } catch(e) {\n this.log.error('mtpSendPlainRequest: deserialization went bad', e);\n const error = Object.assign(baseError, {originalError: e});\n throw error;\n }\n }, (error) => {\n if(!error.message && !error.type) {\n error = Object.assign(baseError, {\n originalError: error\n });\n }\n \n throw error;\n });\n }\n \n private async sendReqPQ(auth: AuthOptions) {\n const request = new TLSerialization({mtproto: true});\n \n request.storeMethod('req_pq_multi', {nonce: auth.nonce});\n\n if(DEBUG) {\n this.log('Send req_pq', auth.nonce.hex);\n }\n\n let deserializer: Awaited<ReturnType<Authorizer['sendPlainRequest']>>;\n try {\n const promise = this.sendPlainRequest(auth.dcId, request.getBytes(true));\n rsaKeysManager.prepare();\n deserializer = await promise;\n } catch(error) {\n this.log.error('req_pq error', (error as Error).message);\n throw error;\n }\n \n const response: ResPQ = deserializer.fetchObject('ResPQ');\n\n if(response._ !== 'resPQ') {\n throw new Error('[MT] resPQ response invalid: ' + response._);\n }\n \n if(!bytesCmp(auth.nonce, response.nonce)) {\n this.log.error(auth.nonce, response.nonce);\n throw new Error('[MT] resPQ nonce mismatch');\n }\n \n auth.serverNonce = response.server_nonce; // need\n auth.pq = response.pq;\n auth.fingerprints = response.server_public_key_fingerprints;\n \n if(DEBUG) {\n this.log('Got ResPQ', bytesToHex(auth.serverNonce), bytesToHex(auth.pq), auth.fingerprints);\n }\n \n const publicKey = await rsaKeysManager.select(auth.fingerprints);\n if(!publicKey) {\n throw new Error('[MT] No public key found');\n }\n \n auth.publicKey = publicKey;\n \n if(DEBUG) {\n this.log('PQ factorization start', auth.pq);\n }\n \n // let pAndQ: Awaited<ReturnType<typeof CryptoWorker['factorize']>>;\n try {\n var pAndQ = await CryptoWorker.invokeCrypto('factorize', auth.pq);\n } catch(error) {\n this.log.error('worker error factorize', error);\n throw error;\n }\n \n auth.p = pAndQ[0];\n auth.q = pAndQ[1];\n \n if(DEBUG) {\n this.log('PQ factorization done', pAndQ);\n }\n \n return this.sendReqDhParams(auth);\n }\n \n private async sendReqDhParams(auth: AuthOptions): Promise<AuthOptions> {\n auth.newNonce = new Uint8Array(32).randomize();\n\n const p_q_inner_data_dc: P_Q_inner_data = {\n _: 'p_q_inner_data_dc',\n pq: auth.pq,\n p: auth.p,\n q: auth.q,\n nonce: auth.nonce,\n server_nonce: auth.serverNonce,\n new_nonce: auth.newNonce,\n dc: 0\n };\n \n const pQInnerDataSerialization = new TLSerialization({mtproto: true});\n pQInnerDataSerialization.storeObject(p_q_inner_data_dc, 'P_Q_inner_data', 'DECRYPTED_DATA');\n\n const data = pQInnerDataSerialization.getBytes(true);\n if(data.length > 144) {\n throw 'DH_params: data is more than 144 bytes!';\n }\n\n const dataWithPadding = addPadding(data, 192, false, true, false);\n const dataPadReversed = dataWithPadding.slice().reverse();\n\n const getKeyAesEncrypted = async() => {\n for(;;) {\n const tempKey = new Uint8Array(32).randomize();\n const dataWithHash = dataPadReversed.concat(await CryptoWorker.invokeCrypto('sha256-hash', tempKey.concat(dataWithPadding)));\n if(dataWithHash.length !== 224) {\n throw 'DH_params: dataWithHash !== 224 bytes!';\n }\n \n const aesEncrypted = await CryptoWorker.invokeCrypto('aes-encrypt', dataWithHash, tempKey, new Uint8Array([0]));\n const tempKeyXor = bytesXor(tempKey, await CryptoWorker.invokeCrypto('sha256-hash', aesEncrypted));\n const keyAesEncrypted = tempKeyXor.concat(aesEncrypted);\n\n const keyAesEncryptedBigInt = str2bigInt(bytesToHex(keyAesEncrypted), 16);\n const publicKeyModulusBigInt = str2bigInt(auth.publicKey.modulus, 16);\n\n if(cmp(keyAesEncryptedBigInt, publicKeyModulusBigInt) === -1) {\n return keyAesEncrypted;\n }\n }\n };\n \n const keyAesEncrypted = await getKeyAesEncrypted();\n const encryptedData = addPadding(await CryptoWorker.invokeCrypto('rsa-encrypt', keyAesEncrypted, auth.publicKey), 256, true, true, true);\n\n const req_DH_params: req_DH_params = {\n nonce: auth.nonce,\n server_nonce: auth.serverNonce,\n p: auth.p,\n q: auth.q,\n public_key_fingerprint: auth.publicKey.fingerprint,\n encrypted_data: encryptedData\n };\n \n const request = new TLSerialization({mtproto: true});\n request.storeMethod('req_DH_params', req_DH_params);\n \n const requestBytes = request.getBytes(true);\n \n if(DEBUG) {\n this.log('Send req_DH_params', req_DH_params/* , requestBytes.hex */);\n }\n \n let deserializer: Awaited<ReturnType<Authorizer['sendPlainRequest']>>;\n try {\n deserializer = await this.sendPlainRequest(auth.dcId, requestBytes);\n } catch(error) {\n this.log.error('Send req_DH_params FAIL!', error);\n throw error;\n }\n \n const response = deserializer.fetchObject('Server_DH_Params', 'RESPONSE');\n \n if(DEBUG) {\n this.log('Sent req_DH_params, response:', response);\n }\n \n if(response._ !== 'server_DH_params_fail' && response._ !== 'server_DH_params_ok') {\n throw new Error('[MT] Server_DH_Params response invalid: ' + response._);\n }\n \n if(!bytesCmp(auth.nonce, response.nonce)) {\n throw new Error('[MT] Server_DH_Params nonce mismatch');\n }\n \n if(!bytesCmp(auth.serverNonce, response.server_nonce)) {\n throw new Error('[MT] Server_DH_Params server_nonce mismatch');\n }\n \n if(response._ === 'server_DH_params_fail') {\n const newNonceHash = (await CryptoWorker.invokeCrypto('sha1-hash', auth.newNonce)).slice(-16);\n if(!bytesCmp(newNonceHash, response.new_nonce_hash)) {\n throw new Error('[MT] server_DH_params_fail new_nonce_hash mismatch');\n }\n \n throw new Error('[MT] server_DH_params_fail');\n }\n \n // fill auth object\n try {\n await this.decryptServerDhDataAnswer(auth, response.encrypted_answer);\n } catch(e) {\n this.log.error('mtpDecryptServerDhDataAnswer FAILED!', e);\n throw e;\n }\n \n //console.log(dT(), 'mtpSendReqDhParams: executing mtpSendSetClientDhParams...');\n \n return this.sendSetClientDhParams(auth);\n }\n \n private async decryptServerDhDataAnswer(auth: AuthOptions, encryptedAnswer: any) {\n auth.localTime = Date.now();\n \n // ! can't concat Array with Uint8Array!\n auth.tmpAesKey = (await CryptoWorker.invokeCrypto('sha1-hash', auth.newNonce.concat(auth.serverNonce)))\n .concat((await CryptoWorker.invokeCrypto('sha1-hash', auth.serverNonce.concat(auth.newNonce))).slice(0, 12));\n \n auth.tmpAesIv = (await CryptoWorker.invokeCrypto('sha1-hash', auth.serverNonce.concat(auth.newNonce))).slice(12)\n .concat(await CryptoWorker.invokeCrypto('sha1-hash', auth.newNonce.concat(auth.newNonce)), auth.newNonce.slice(0, 4));\n \n const answerWithHash = new Uint8Array(await CryptoWorker.invokeCrypto('aes-decrypt', encryptedAnswer, auth.tmpAesKey, auth.tmpAesIv));\n \n const hash = answerWithHash.slice(0, 20);\n const answerWithPadding = answerWithHash.slice(20);\n\n const deserializer = new TLDeserialization<MTLong>(answerWithPadding, {mtproto: true});\n const response = deserializer.fetchObject('Server_DH_inner_data');\n \n if(response._ !== 'server_DH_inner_data') {\n throw new Error('[MT] server_DH_inner_data response invalid: ' + response);\n }\n \n if(!bytesCmp(auth.nonce, response.nonce)) {\n throw new Error('[MT] server_DH_inner_data nonce mismatch');\n }\n \n if(!bytesCmp(auth.serverNonce, response.server_nonce)) {\n throw new Error('[MT] server_DH_inner_data serverNonce mismatch');\n }\n \n if(DEBUG) {\n this.log('Done decrypting answer');\n }\n auth.g = response.g;\n auth.dhPrime = response.dh_prime;\n auth.gA = response.g_a;\n auth.serverTime = response.server_time;\n auth.retry = 0;\n \n this.verifyDhParams(auth.g, auth.dhPrime, auth.gA);\n \n const offset = deserializer.getOffset();\n \n if(!bytesCmp(hash, await CryptoWorker.invokeCrypto('sha1-hash', answerWithPadding.slice(0, offset)))) {\n throw new Error('[MT] server_DH_inner_data SHA1-hash mismatch');\n }\n \n timeManager.applyServerTime(auth.serverTime, auth.localTime);\n }\n \n private verifyDhParams(g: number, dhPrime: Uint8Array, gA: Uint8Array) {\n if(DEBUG) {\n this.log('Verifying DH params', g, dhPrime, gA);\n }\n\n const dhPrimeHex = bytesToHex(dhPrime);\n if(g !== 3 || dhPrimeHex !== 'c71caeb9c6b1c9048e6c522f70f13f73980d40238e3e21c14934d037563d930f48198a0aa7c14058229493d22530f4dbfa336f6e0ac925139543aed44cce7c3720fd51f69458705ac68cd4fe6b6b13abdc9746512969328454f18faf8c595f642477fe96bb2a941d5bcd1d4ac8cc49880708fa9b378e3c4f3a9060bee67cf9a4a4a695811051907e162753b56b0f6b410dba74d8a84b2a14b3144e0ef1284754fd17ed950d5965b4b9dd46582db1178d169c6bc465b0d6ff9ca3928fef5b9ae4e418fc15e83ebea0f87fa9ff5eed70050ded2849f47bf959d956850ce929851f0d8115f635b105ee2e4e15d04b2454bf6f4fadf034b10403119cd8e3b92fcc5b') {\n // The verified value is from https://core.telegram.org/mtproto/security_guidelines\n throw new Error('[MT] DH params are not verified: unknown dhPrime');\n }\n\n if(DEBUG) {\n this.log('dhPrime cmp OK');\n }\n \n const _gABigInt = str2bigInt(bytesToHex(gA), 16);\n const _dhPrimeBigInt = str2bigInt(dhPrimeHex, 16);\n\n if(cmp(_gABigInt, one) <= 0) {\n throw new Error('[MT] DH params are not verified: gA <= 1');\n }\n\n if(cmp(_gABigInt, sub(_dhPrimeBigInt, one)) >= 0) {\n throw new Error('[MT] DH params are not verified: gA >= dhPrime - 1');\n }\n\n if(DEBUG) {\n this.log('1 < gA < dhPrime-1 OK');\n }\n \n const _two = int2bigInt(2, 32, 0);\n const _twoPow = pow(_two, 2048 - 64);\n\n if(cmp(_gABigInt, _twoPow) < 0) {\n throw new Error('[MT] DH params are not verified: gA < 2^{2048-64}');\n }\n if(cmp(_gABigInt, sub(_dhPrimeBigInt, _twoPow)) >= 0) {\n throw new Error('[MT] DH params are not verified: gA > dhPrime - 2^{2048-64}');\n }\n\n if(DEBUG) {\n this.log('2^{2048-64} < gA < dhPrime-2^{2048-64} OK');\n }\n \n return true;\n }\n \n private async sendSetClientDhParams(auth: AuthOptions): Promise<AuthOptions> {\n const gBytes = bytesFromHex(auth.g.toString(16));\n \n auth.b = new Uint8Array(256).randomize();\n //MTProto.secureRandom.nextBytes(auth.b);\n \n // let gB: Awaited<ReturnType<typeof CryptoWorker['modPow']>>;\n try {\n var gB = await CryptoWorker.invokeCrypto('mod-pow', gBytes, auth.b, auth.dhPrime);\n } catch(error) {\n throw error;\n }\n \n const data = new TLSerialization({mtproto: true});\n data.storeObject({\n _: 'client_DH_inner_data',\n nonce: auth.nonce,\n server_nonce: auth.serverNonce,\n retry_id: [0, auth.retry++],\n g_b: gB\n }, 'Client_DH_Inner_Data');\n \n const dataWithHash = (await CryptoWorker.invokeCrypto('sha1-hash', data.getBuffer())).concat(data.getBytes(true));\n const encryptedData = await CryptoWorker.invokeCrypto('aes-encrypt', dataWithHash, auth.tmpAesKey, auth.tmpAesIv);\n \n const request = new TLSerialization({mtproto: true});\n request.storeMethod('set_client_DH_params', {\n nonce: auth.nonce,\n server_nonce: auth.serverNonce,\n encrypted_data: encryptedData\n });\n \n if(DEBUG) {\n this.log('Send set_client_DH_params');\n }\n \n let deserializer: Awaited<ReturnType<Authorizer['sendPlainRequest']>>;\n try {\n deserializer = await this.sendPlainRequest(auth.dcId, request.getBytes(true));\n } catch(err) {\n throw err;\n }\n \n const response = deserializer.fetchObject('Set_client_DH_params_answer');\n \n if(response._ !== 'dh_gen_ok' && response._ !== 'dh_gen_retry' && response._ !== 'dh_gen_fail') {\n throw new Error('[MT] Set_client_DH_params_answer response invalid: ' + response._);\n }\n \n if(!bytesCmp(auth.nonce, response.nonce)) {\n throw new Error('[MT] Set_client_DH_params_answer nonce mismatch');\n }\n \n if(!bytesCmp(auth.serverNonce, response.server_nonce)) {\n throw new Error('[MT] Set_client_DH_params_answer server_nonce mismatch');\n }\n \n // let authKey: Uint8Array;\n try {\n var authKey = await CryptoWorker.invokeCrypto('mod-pow', auth.gA, auth.b, auth.dhPrime);\n } catch(err) {\n throw authKey;\n }\n \n const authKeyHash = await CryptoWorker.invokeCrypto('sha1-hash', authKey),\n authKeyAux = authKeyHash.slice(0, 8),\n authKeyId = authKeyHash.slice(-8);\n \n if(DEBUG) {\n this.log('Got Set_client_DH_params_answer', response._, authKey);\n }\n switch(response._) {\n case 'dh_gen_ok': {\n const newNonceHash1 = (await CryptoWorker.invokeCrypto('sha1-hash', auth.newNonce.concat([1], authKeyAux))).slice(-16);\n \n if(!bytesCmp(newNonceHash1, response.new_nonce_hash1)) {\n this.log.error('Set_client_DH_params_answer new_nonce_hash1 mismatch', newNonceHash1, response);\n throw new Error('new_nonce_hash1 mismatch');\n }\n \n const serverSalt = bytesXor(auth.newNonce.slice(0, 8), auth.serverNonce.slice(0, 8));\n if(DEBUG) {\n this.log('Auth successfull!', authKeyId, authKey, serverSalt);\n }\n \n auth.authKeyId = authKeyId;\n auth.authKey = authKey;\n auth.serverSalt = serverSalt;\n \n return auth;\n }\n \n case 'dh_gen_retry': {\n const newNonceHash2 = (await CryptoWorker.invokeCrypto('sha1-hash', auth.newNonce.concat([2], authKeyAux))).slice(-16);\n if(!bytesCmp(newNonceHash2, response.new_nonce_hash2)) {\n throw new Error('[MT] Set_client_DH_params_answer new_nonce_hash2 mismatch');\n }\n \n return this.sendSetClientDhParams(auth);\n }\n \n case 'dh_gen_fail': {\n const newNonceHash3 = (await CryptoWorker.invokeCrypto('sha1-hash', auth.newNonce.concat([3], authKeyAux))).slice(-16);\n if(!bytesCmp(newNonceHash3, response.new_nonce_hash3)) {\n throw new Error('[MT] Set_client_DH_params_answer new_nonce_hash3 mismatch');\n }\n \n throw new Error('[MT] Set_client_DH_params_answer fail');\n }\n }\n }\n\n \n private getTransportType() {\n if(this.getTransportTypePromise) return this.getTransportTypePromise;\n return this.getTransportTypePromise = transportController.pingTransports().then(({websocket}) => {\n this.transportType = websocket ? 'websocket' : 'https';\n this.log('will use transport:', this.transportType);\n });\n }\n \n \n public auth(dcId: DcId) {\n let promise = this.cached[dcId];\n if(promise) {\n return promise;\n }\n\n promise = new Promise(async(resolve, reject) => {\n \n await this.getTransportType();\n \n\n let error: ApiError;\n let _try = 1;\n while(_try++ <= 3) {\n try {\n const auth: AuthOptions = {\n dcId, \n nonce: new Uint8Array(16).randomize()\n };\n \n const promise = this.sendReqPQ(auth);\n resolve(await promise);\n return;\n } catch(err) {\n error = err;\n }\n }\n\n reject(error);\n });\n\n return this.cached[dcId] = promise;\n }\n}\n\nexport default new Authorizer();\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov <igor.beatle@gmail.com>\r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport type { UserAuth } from './mtproto_config';\r\nimport sessionStorage from '../sessionStorage';\r\nimport MTPNetworker, { MTMessage } from './networker';\r\nimport { isObject } from './bin_utils';\r\nimport networkerFactory from './networkerFactory';\r\n//import { telegramMeWebService } from './mtproto';\r\nimport authorizer from './authorizer';\r\nimport dcConfigurator, { ConnectionType, DcConfigurator, TransportType } from './dcConfigurator';\r\nimport { logger } from '../logger';\r\nimport type { DcAuthKey, DcId, DcServerSalt, InvokeApiOptions } from '../../types';\r\nimport type { MethodDeclMap } from '../../layer';\r\nimport { CancellablePromise, deferredPromise } from '../../helpers/cancellablePromise';\r\nimport { bytesFromHex, bytesToHex } from '../../helpers/bytes';\r\n//import { clamp } from '../../helpers/number';\r\nimport { IS_SAFARI } from '../../environment/userAgent';\r\nimport App from '../../config/app';\r\nimport { MOUNT_CLASS_TO } from '../../config/debug';\r\nimport IDBStorage from '../idb';\r\nimport CryptoWorker from \"../crypto/cryptoworker\";\r\nimport ctx from '../../environment/ctx';\r\nimport noop from '../../helpers/noop';\r\nimport Modes from '../../config/modes';\r\n\r\n \r\n \r\n \r\n\r\n \r\nimport transportController from './transports/controller';\r\n \r\n\r\n/* var networker = apiManager.cachedNetworkers.websocket.upload[2];\r\nnetworker.wrapMtpMessage({\r\n _: 'msgs_state_req',\r\n msg_ids: [\"6888292542796810828\"]\r\n}, {\r\n notContentRelated: true\r\n}).then(res => {\r\n console.log('status', res);\r\n}); */\r\n\r\n//console.error('apiManager included!');\r\n// TODO: если запрос словил флуд, нужно сохранять его параметры и возвращать тот же промис на новый такой же запрос, например - загрузка истории\r\n\r\nexport type ApiError = Partial<{\r\n code: number,\r\n type: string,\r\n description: string,\r\n originalError: any,\r\n stack: string,\r\n handled: boolean,\r\n input: string,\r\n message: ApiError\r\n}>;\r\n\r\n/* class RotatableArray<T> {\r\n public array: Array<T> = [];\r\n private lastIndex = -1;\r\n\r\n public get() {\r\n this.lastIndex = clamp(this.lastIndex + 1, 0, this.array.length - 1);\r\n return this.array[this.lastIndex];\r\n }\r\n} */\r\n\r\nexport class ApiManager {\r\n private cachedNetworkers: {\r\n [transportType in TransportType]: {\r\n [connectionType in ConnectionType]: {\r\n [dcId: DcId]: MTPNetworker[]\r\n }\r\n }\r\n };\r\n \r\n private cachedExportPromise: {[x: number]: Promise<unknown>};\r\n private gettingNetworkers: {[dcIdAndType: string]: Promise<MTPNetworker>};\r\n private baseDcId: DcId;\r\n \r\n //public telegramMeNotified = false;\r\n\r\n private log: ReturnType<typeof logger>;\r\n\r\n private afterMessageTempIds: {\r\n [tempId: string]: {\r\n messageId: string,\r\n promise: Promise<any>\r\n }\r\n };\r\n\r\n private transportType: TransportType;\r\n \r\n constructor() {\r\n this.log = logger('API');\r\n\r\n this.cachedNetworkers = {} as any;\r\n this.cachedExportPromise = {};\r\n this.gettingNetworkers = {};\r\n this.baseDcId = 0;\r\n this.afterMessageTempIds = {};\r\n\r\n this.transportType = Modes.transport;\r\n\r\n \r\n transportController.addEventListener('transport', (transportType) => {\r\n this.changeTransportType(transportType);\r\n });\r\n \r\n }\r\n\r\n //private lol = false;\r\n \r\n // constructor() {\r\n //MtpSingleInstanceService.start();\r\n \r\n /* AppStorage.get<number>('dc').then((dcId) => {\r\n if(dcId) {\r\n this.baseDcId = dcId;\r\n }\r\n }); */\r\n // }\r\n \r\n /* public telegramMeNotify(newValue: boolean) {\r\n if(this.telegramMeNotified !== newValue) {\r\n this.telegramMeNotified = newValue;\r\n //telegramMeWebService.setAuthorized(this.telegramMeNotified);\r\n }\r\n } */\r\n\r\n private getTransportType(connectionType: ConnectionType) {\r\n \r\n \r\n \r\n \r\n \r\n // @ts-ignore\r\n const transportType: TransportType = this.transportType;\r\n \r\n\r\n return transportType;\r\n }\r\n\r\n private iterateNetworkers(callback: (o: {networker: MTPNetworker, dcId: DcId, connectionType: ConnectionType, transportType: TransportType, index: number, array: MTPNetworker[]}) => void) {\r\n for(const transportType in this.cachedNetworkers) {\r\n const connections = this.cachedNetworkers[transportType as TransportType];\r\n for(const connectionType in connections) {\r\n const dcs = connections[connectionType as ConnectionType];\r\n for(const dcId in dcs) {\r\n const networkers = dcs[dcId as any as DcId];\r\n networkers.forEach((networker, idx, arr) => {\r\n callback({\r\n networker,\r\n dcId: +dcId as DcId,\r\n connectionType: connectionType as ConnectionType,\r\n transportType: transportType as TransportType,\r\n index: idx,\r\n array: arr\r\n });\r\n });\r\n }\r\n }\r\n }\r\n }\r\n\r\n private chooseServer(dcId: DcId, connectionType: ConnectionType, transportType: TransportType) {\r\n return dcConfigurator.chooseServer(dcId, connectionType, transportType, connectionType === 'client');\r\n }\r\n\r\n public changeTransportType(transportType: TransportType) {\r\n const oldTransportType = this.transportType;\r\n if(oldTransportType === transportType) {\r\n return;\r\n }\r\n\r\n this.log('changing transport from', oldTransportType, 'to', transportType);\r\n\r\n const oldObject = this.cachedNetworkers[oldTransportType];\r\n const newObject = this.cachedNetworkers[transportType];\r\n this.cachedNetworkers[transportType] = oldObject;\r\n this.cachedNetworkers[oldTransportType] = newObject;\r\n\r\n this.transportType = transportType;\r\n\r\n for(const oldGetKey in this.gettingNetworkers) {\r\n const promise = this.gettingNetworkers[oldGetKey];\r\n delete this.gettingNetworkers[oldGetKey];\r\n\r\n const newGetKey = oldGetKey.replace(oldTransportType, transportType);\r\n this.gettingNetworkers[newGetKey] = promise;\r\n\r\n this.log('changed networker getKey from', oldGetKey, 'to', newGetKey)\r\n }\r\n\r\n this.iterateNetworkers((info) => {\r\n const transportType = this.getTransportType(info.connectionType);\r\n const transport = this.chooseServer(info.dcId, info.connectionType, transportType);\r\n info.networker.changeTransport(transport);\r\n });\r\n }\r\n\r\n public async getBaseDcId() {\r\n if(this.baseDcId) {\r\n return this.baseDcId;\r\n }\r\n\r\n const baseDcId = await sessionStorage.get('dc');\r\n if(!this.baseDcId) {\r\n if(!baseDcId) {\r\n this.setBaseDcId(App.baseDcId);\r\n } else {\r\n this.baseDcId = baseDcId;\r\n }\r\n }\r\n\r\n return this.baseDcId;\r\n }\r\n \r\n public async setUserAuth(userAuth: UserAuth) {\r\n if(!userAuth.dcID) {\r\n const baseDcId = await this.getBaseDcId();\r\n userAuth.dcID = baseDcId;\r\n }\r\n\r\n sessionStorage.set({\r\n user_auth: userAuth\r\n });\r\n \r\n //this.telegramMeNotify(true);\r\n\r\n \r\n \r\n \r\n }\r\n\r\n public setBaseDcId(dcId: DcId) {\r\n const wasDcId = this.baseDcId;\r\n if(wasDcId) { // if migrated set ondrain\r\n this.getNetworker(wasDcId).then(networker => {\r\n this.setOnDrainIfNeeded(networker);\r\n });\r\n }\r\n\r\n this.baseDcId = dcId;\r\n\r\n sessionStorage.set({\r\n dc: this.baseDcId\r\n });\r\n }\r\n \r\n public async logOut() {\r\n const storageKeys: Array<DcAuthKey> = [];\r\n \r\n const prefix = 'dc';\r\n for(let dcId = 1; dcId <= 5; dcId++) {\r\n storageKeys.push(prefix + dcId + '_auth_key' as any);\r\n }\r\n \r\n // WebPushApiManager.forceUnsubscribe(); // WARNING // moved to worker's master\r\n const storageResult = await Promise.all(storageKeys.map(key => sessionStorage.get(key)));\r\n \r\n const logoutPromises: Promise<any>[] = [];\r\n for(let i = 0; i < storageResult.length; i++) {\r\n if(storageResult[i]) {\r\n logoutPromises.push(this.invokeApi('auth.logOut', {}, {dcId: (i + 1) as DcId, ignoreErrors: true}));\r\n }\r\n }\r\n\r\n const clear = () => {\r\n //console.error('apiManager: logOut clear');\r\n \r\n this.baseDcId = undefined;\r\n //this.telegramMeNotify(false);\r\n IDBStorage.closeDatabases();\r\n self.postMessage({type: 'clear'});\r\n };\r\n\r\n setTimeout(clear, 1e3);\r\n\r\n //return;\r\n \r\n return Promise.all(logoutPromises).catch((error) => {\r\n error.handled = true;\r\n }).finally(clear)/* .then(() => {\r\n location.pathname = '/';\r\n }) */;\r\n }\r\n\r\n private generateNetworkerGetKey(dcId: DcId, transportType: TransportType, connectionType: ConnectionType) {\r\n return [dcId, transportType, connectionType].join('-');\r\n }\r\n \r\n public getNetworker(dcId: DcId, options: InvokeApiOptions = {}): Promise<MTPNetworker> {\r\n const connectionType: ConnectionType = options.fileDownload ? 'download' : (options.fileUpload ? 'upload' : 'client');\r\n //const connectionType: ConnectionType = 'client';\r\n\r\n const transportType = this.getTransportType(connectionType);\r\n if(!this.cachedNetworkers[transportType]) {\r\n this.cachedNetworkers[transportType] = {\r\n client: {},\r\n download: {},\r\n upload: {}\r\n };\r\n }\r\n\r\n const cache = this.cachedNetworkers[transportType][connectionType];\r\n if(!(dcId in cache)) {\r\n cache[dcId] = [];\r\n }\r\n \r\n const networkers = cache[dcId];\r\n // @ts-ignore\r\n const maxNetworkers = connectionType === 'client' || transportType === 'https' ? 1 : (connectionType === 'download' ? 3 : 3);\r\n if(networkers.length >= maxNetworkers) {\r\n let i = networkers.length - 1, found = false;\r\n for(; i >= 0; --i) {\r\n if(networkers[i].isOnline) {\r\n found = true;\r\n break;\r\n }\r\n }\r\n \r\n const networker = found ? networkers.splice(i, 1)[0] : networkers.pop();\r\n networkers.unshift(networker);\r\n return Promise.resolve(networker);\r\n }\r\n \r\n let getKey = this.generateNetworkerGetKey(dcId, transportType, connectionType);\r\n if(this.gettingNetworkers[getKey]) {\r\n return this.gettingNetworkers[getKey];\r\n }\r\n\r\n const ak: DcAuthKey = `dc${dcId}_auth_key` as any;\r\n const ss: DcServerSalt = `dc${dcId}_server_salt` as any;\r\n \r\n let transport = this.chooseServer(dcId, connectionType, transportType);\r\n return this.gettingNetworkers[getKey] = Promise.all([ak, ss].map(key => sessionStorage.get(key)))\r\n .then(async([authKeyHex, serverSaltHex]) => {\r\n let networker: MTPNetworker, error: any;\r\n if(authKeyHex && authKeyHex.length === 512) {\r\n if(!serverSaltHex || serverSaltHex.length !== 16) {\r\n serverSaltHex = 'AAAAAAAAAAAAAAAA';\r\n }\r\n \r\n const authKey = bytesFromHex(authKeyHex);\r\n const authKeyId = (await CryptoWorker.invokeCrypto('sha1-hash', authKey)).slice(-8);\r\n const serverSalt = bytesFromHex(serverSaltHex);\r\n \r\n networker = networkerFactory.getNetworker(dcId, authKey, authKeyId, serverSalt, options);\r\n } else {\r\n try { // if no saved state\r\n const auth = await authorizer.auth(dcId);\r\n \r\n sessionStorage.set({\r\n [ak]: bytesToHex(auth.authKey),\r\n [ss]: bytesToHex(auth.serverSalt)\r\n });\r\n \r\n networker = networkerFactory.getNetworker(dcId, auth.authKey, auth.authKeyId, auth.serverSalt, options);\r\n } catch(_error) {\r\n error = _error;\r\n }\r\n }\r\n\r\n // ! cannot get it before this promise because simultaneous changeTransport will change nothing\r\n const newTransportType = this.getTransportType(connectionType);\r\n if(newTransportType !== transportType) {\r\n getKey = this.generateNetworkerGetKey(dcId, newTransportType, connectionType);\r\n transport.destroy();\r\n DcConfigurator.removeTransport(dcConfigurator.chosenServers, transport);\r\n\r\n if(networker) {\r\n transport = this.chooseServer(dcId, connectionType, newTransportType);\r\n }\r\n\r\n this.log('transport has been changed during authorization from', transportType, 'to', newTransportType);\r\n }\r\n\r\n /* networker.onConnectionStatusChange = (online) => {\r\n console.log('status:', online);\r\n }; */\r\n \r\n delete this.gettingNetworkers[getKey];\r\n\r\n if(error) {\r\n this.log('get networker error', error, (error as Error).stack);\r\n throw error;\r\n }\r\n\r\n networker.changeTransport(transport);\r\n networkers.unshift(networker);\r\n this.setOnDrainIfNeeded(networker);\r\n return networker;\r\n });\r\n }\r\n\r\n public setOnDrainIfNeeded(networker: MTPNetworker) {\r\n if(networker.onDrain) {\r\n return;\r\n }\r\n \r\n const checkPromise: Promise<boolean> = networker.isFileNetworker ? \r\n Promise.resolve(true) : \r\n this.getBaseDcId().then(baseDcId => networker.dcId !== baseDcId);\r\n checkPromise.then(canRelease => {\r\n if(networker.onDrain) {\r\n return;\r\n }\r\n \r\n if(canRelease) {\r\n networker.onDrain = () => {\r\n this.log('networker drain', networker.dcId);\r\n\r\n networker.onDrain = undefined;\r\n networker.destroy();\r\n networkerFactory.removeNetworker(networker);\r\n DcConfigurator.removeTransport(this.cachedNetworkers, networker);\r\n };\r\n\r\n networker.setDrainTimeout();\r\n }\r\n });\r\n }\r\n \r\n public invokeApi<T extends keyof MethodDeclMap>(method: T, params: MethodDeclMap[T]['req'] = {}, options: InvokeApiOptions = {}): CancellablePromise<MethodDeclMap[T][\"res\"]> {\r\n ///////this.log('Invoke api', method, params, options);\r\n\r\n /* if(!this.lol) {\r\n networkerFactory.updatesProcessor({_: 'new_session_created'}, true);\r\n this.lol = true;\r\n } */\r\n\r\n const deferred = deferredPromise<MethodDeclMap[T]['res']>();\r\n\r\n let {afterMessageId, prepareTempMessageId} = options;\r\n if(prepareTempMessageId) {\r\n deferred.then(() => {\r\n delete this.afterMessageTempIds[prepareTempMessageId];\r\n });\r\n }\r\n\r\n if(MOUNT_CLASS_TO) {\r\n const startTime = Date.now();\r\n const interval = ctx.setInterval(() => {\r\n if(!cachedNetworker || !cachedNetworker.isStopped()) {\r\n this.log.error('Request is still processing:', method, params, options, 'time:', (Date.now() - startTime) / 1000);\r\n }\r\n //this.cachedUploadNetworkers[2].requestMessageStatus();\r\n }, 5e3);\r\n\r\n deferred.catch(noop).finally(() => {\r\n clearInterval(interval);\r\n });\r\n }\r\n\r\n const rejectPromise = (error: ApiError) => {\r\n if(!error) {\r\n error = {type: 'ERROR_EMPTY'};\r\n } else if(!isObject(error)) {\r\n error = {message: error};\r\n }\r\n \r\n deferred.reject(error);\r\n\r\n if((error.code === 401 && error.type === 'SESSION_REVOKED') || \r\n (error.code === 406 && error.type === 'AUTH_KEY_DUPLICATED')) {\r\n this.logOut();\r\n }\r\n\r\n if(options.ignoreErrors) {\r\n return;\r\n }\r\n \r\n if(error.code === 406) {\r\n error.handled = true;\r\n }\r\n \r\n if(!options.noErrorBox) {\r\n error.input = method;\r\n error.stack = stack || (error.originalError && error.originalError.stack) || error.stack || (new Error()).stack;\r\n setTimeout(() => {\r\n if(!error.handled) {\r\n if(error.code === 401) {\r\n this.logOut();\r\n } else {\r\n // ErrorService.show({error: error}); // WARNING\r\n }\r\n \r\n error.handled = true;\r\n }\r\n }, 100);\r\n }\r\n };\r\n \r\n let dcId: DcId;\r\n \r\n let cachedNetworker: MTPNetworker;\r\n let stack = (new Error()).stack || 'empty stack';\r\n const performRequest = (networker: MTPNetworker) => {\r\n if(afterMessageId) {\r\n const after = this.afterMessageTempIds[afterMessageId];\r\n if(after) {\r\n options.afterMessageId = after.messageId;\r\n }\r\n }\r\n\r\n const promise = (cachedNetworker = networker).wrapApiCall(method, params, options);\r\n\r\n if(prepareTempMessageId) {\r\n this.afterMessageTempIds[prepareTempMessageId] = {\r\n messageId: (options as MTMessage).messageId,\r\n promise: deferred\r\n };\r\n }\r\n\r\n return promise.then(deferred.resolve, (error: ApiError) => {\r\n //if(!options.ignoreErrors) {\r\n if(error.type !== 'FILE_REFERENCE_EXPIRED'/* && error.type !== 'MSG_WAIT_FAILED' */) {\r\n this.log.error('Error', error.code, error.type, this.baseDcId, dcId, method, params);\r\n }\r\n \r\n if(error.code === 401 && this.baseDcId === dcId) {\r\n if(error.type !== 'SESSION_PASSWORD_NEEDED') {\r\n sessionStorage.delete('dc')\r\n sessionStorage.delete('user_auth'); // ! возможно тут вообще не нужно это делать, но нужно проверить случай с USER_DEACTIVATED (https://core.telegram.org/api/errors)\r\n //this.telegramMeNotify(false);\r\n }\r\n \r\n rejectPromise(error);\r\n } else if(error.code === 401 && this.baseDcId && dcId !== this.baseDcId) {\r\n if(this.cachedExportPromise[dcId] === undefined) {\r\n const promise = new Promise((exportResolve, exportReject) => {\r\n this.invokeApi('auth.exportAuthorization', {dc_id: dcId}, {noErrorBox: true}).then((exportedAuth) => {\r\n this.invokeApi('auth.importAuthorization', {\r\n id: exportedAuth.id,\r\n bytes: exportedAuth.bytes\r\n }, {dcId, noErrorBox: true}).then(exportResolve, exportReject);\r\n }, exportReject);\r\n });\r\n \r\n this.cachedExportPromise[dcId] = promise;\r\n }\r\n \r\n this.cachedExportPromise[dcId].then(() => {\r\n //(cachedNetworker = networker).wrapApiCall(method, params, options).then(deferred.resolve, rejectPromise);\r\n this.invokeApi(method, params, options).then(deferred.resolve, rejectPromise);\r\n }, rejectPromise);\r\n } else if(error.code === 303) {\r\n const newDcId = +error.type.match(/^(PHONE_MIGRATE_|NETWORK_MIGRATE_|USER_MIGRATE_)(\\d+)/)[2] as DcId;\r\n if(newDcId !== dcId) {\r\n if(options.dcId) {\r\n options.dcId = newDcId;\r\n } else {\r\n this.setBaseDcId(newDcId);\r\n }\r\n \r\n this.getNetworker(newDcId, options).then((networker) => {\r\n networker.wrapApiCall(method, params, options).then(deferred.resolve, rejectPromise);\r\n }, rejectPromise);\r\n }\r\n } else if(error.code === 400 && error.type.indexOf('FILE_MIGRATE') === 0) {\r\n const newDcId = +error.type.match(/^(FILE_MIGRATE_)(\\d+)/)[2] as DcId;\r\n if(newDcId !== dcId) {\r\n this.getNetworker(newDcId, options).then((networker) => {\r\n networker.wrapApiCall(method, params, options).then(deferred.resolve, rejectPromise);\r\n }, rejectPromise);\r\n } else {\r\n rejectPromise(error);\r\n }\r\n } else if(!options.rawError && error.code === 420) {\r\n const waitTime = +error.type.match(/^FLOOD_WAIT_(\\d+)/)[1] || 1;\r\n \r\n if(waitTime > (options.floodMaxTimeout !== undefined ? options.floodMaxTimeout : 60) && !options.prepareTempMessageId) {\r\n return rejectPromise(error);\r\n }\r\n \r\n setTimeout(() => {\r\n performRequest(cachedNetworker);\r\n }, waitTime/* (waitTime + 5) */ * 1000); // 03.02.2020\r\n } else if(!options.rawError && ['MSG_WAIT_FAILED', 'MSG_WAIT_TIMEOUT'].includes(error.type)) {\r\n const after = this.afterMessageTempIds[afterMessageId];\r\n\r\n afterMessageId = undefined;\r\n delete options.afterMessageId;\r\n\r\n if(after) after.promise.then(() => performRequest(cachedNetworker));\r\n else performRequest(cachedNetworker);\r\n } else if(!options.rawError && error.code === 500) {\r\n const now = Date.now();\r\n if(options.stopTime) {\r\n if(now >= options.stopTime) {\r\n return rejectPromise(error);\r\n }\r\n }\r\n \r\n options.waitTime = options.waitTime ? Math.min(60, options.waitTime * 1.5) : 1;\r\n setTimeout(() => {\r\n performRequest(cachedNetworker);\r\n }, options.waitTime * 1000);\r\n } else if(error.type === 'UNKNOWN') {\r\n setTimeout(() => {\r\n performRequest(cachedNetworker);\r\n }, 1000);\r\n } else {\r\n rejectPromise(error);\r\n }\r\n });\r\n }\r\n \r\n if(dcId = (options.dcId || this.baseDcId)) {\r\n this.getNetworker(dcId, options).then(performRequest, rejectPromise);\r\n } else {\r\n this.getBaseDcId().then(baseDcId => {\r\n this.getNetworker(dcId = baseDcId, options).then(performRequest, rejectPromise);\r\n });\r\n }\r\n\r\n return deferred;\r\n }\r\n}\r\n\r\nconst apiManager = new ApiManager();\r\nMOUNT_CLASS_TO.apiManager = apiManager;\r\nexport default apiManager;\r\n","export default async function getScreenStream(constraints: DisplayMediaStreamConstraints) {\n const screenStream = await navigator.mediaDevices.getDisplayMedia(constraints);\n return screenStream;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport getScreenStream from \"./getScreenStream\";\nimport getStream from \"./getStream\";\n\n/**\n * ! Use multiple constraints together only with first invoke\n */\nexport default function getStreamCached() {\n const _cache: {\n main: Partial<{\n audio: Promise<MediaStream>,\n video: Promise<MediaStream>\n }>,\n screen: Partial<{\n audio: Promise<MediaStream>,\n video: Promise<MediaStream>\n }>\n } = {\n main: {},\n screen: {}\n };\n\n return async(options: {\n isScreen: true, \n constraints: DisplayMediaStreamConstraints,\n } | {\n isScreen?: false,\n constraints: MediaStreamConstraints, \n muted: boolean\n }) => {\n const {isScreen, constraints} = options;\n const cache = _cache[isScreen ? 'screen' : 'main'];\n let promise: Promise<MediaStream> = cache[constraints.audio ? 'audio' : 'video'];\n\n if(!promise) {\n promise = (isScreen ? getScreenStream : getStream)(constraints, (options as any).muted);\n if(constraints.audio && !cache.audio) cache.audio = promise.finally(() => cache.audio = undefined);\n if(constraints.video && !cache.video) cache.video = promise.finally(() => cache.video = undefined);\n }\n\n try {\n return await promise;\n /* let out: Partial<{\n audio: MediaStream,\n video: MediaStream\n }> = {};\n\n await Promise.all([\n constraints.audio && cache.audio.then(stream => out.audio = stream),\n constraints.video && cache.video.then(stream => out.video = stream)\n ].filter(Boolean));\n\n return out; */\n } catch(err) {\n throw err;\n }\n };\n}\n\n(window as any).getStreamCached = getStreamCached;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport EventListenerBase, { EventListenerListeners } from \"../../helpers/eventListenerBase\";\nimport noop from \"../../helpers/noop\";\nimport { logger } from \"../logger\";\nimport getAudioConstraints from \"./helpers/getAudioConstraints\";\nimport getStreamCached from \"./helpers/getStreamCached\";\nimport getVideoConstraints from \"./helpers/getVideoConstraints\";\nimport LocalConferenceDescription from \"./localConferenceDescription\";\nimport StreamManager, { StreamItem } from \"./streamManager\";\n\nexport type TryAddTrackOptions = {\n stream: MediaStream, \n track: MediaStreamTrack, \n type: StreamItem['type'], \n source?: string\n};\n\nexport default abstract class CallInstanceBase<E extends EventListenerListeners> extends EventListenerBase<E> {\n protected log: ReturnType<typeof logger>;\n protected outputDeviceId: string;\n\n protected player: HTMLElement;\n protected elements: Map<string, HTMLMediaElement>;\n\n protected audio: HTMLAudioElement;\n // protected fixedSafariAudio: boolean;\n\n protected getStream: ReturnType<typeof getStreamCached>;\n\n constructor() {\n super(false);\n\n const player = this.player = document.createElement('div');\n player.classList.add('call-player');\n player.style.display = 'none';\n document.body.append(player);\n\n this.elements = new Map();\n\n // possible Safari fix\n const audio = this.audio = new Audio();\n audio.autoplay = true;\n audio.volume = 1.0;\n this.player.append(audio);\n this.elements.set('audio', audio);\n\n this.fixSafariAudio();\n\n this.getStream = getStreamCached();\n }\n\n public get isSharingAudio() {\n return !!this.streamManager.hasInputTrackKind('audio');\n }\n\n public get isSharingVideo() {\n return !!this.streamManager.hasInputTrackKind('video');\n }\n\n public abstract get isMuted(): boolean;\n public abstract get isClosing(): boolean;\n\n public fixSafariAudio() {\n // if(this.fixedSafariAudio) return;\n this.audio.play().catch(noop);\n // this.fixedSafariAudio = true;\n }\n\n public requestAudioSource(muted: boolean) {\n return this.requestInputSource(true, false, muted);\n }\n\n public requestInputSource(audio: boolean, video: boolean, muted: boolean) {\n const {streamManager} = this;\n if(streamManager) {\n const isAudioGood = !audio || this.isSharingAudio;\n const isVideoGood = !video || this.isSharingVideo;\n if(isAudioGood && isVideoGood) {\n return Promise.resolve();\n }\n }\n\n const constraints: MediaStreamConstraints = {\n audio: audio && getAudioConstraints(),\n video: video && getVideoConstraints()\n };\n \n return this.getStream({\n constraints, \n muted\n }).then(stream => {\n if(stream.getVideoTracks().length) {\n this.saveInputVideoStream(stream, 'main');\n }\n \n this.onInputStream(stream);\n });\n }\n\n public getElement(endpoint: number | string) {\n return this.elements.get('' + endpoint);\n }\n\n public abstract get streamManager(): StreamManager;\n public abstract get description(): LocalConferenceDescription;\n public abstract toggleMuted(): Promise<void>;\n\n public cleanup() {\n this.player.textContent = '';\n this.player.remove();\n this.elements.clear();\n\n // can have no connectionInstance but streamManager with input stream\n this.streamManager.stop();\n\n super.cleanup();\n }\n\n public onTrack(event: RTCTrackEvent) {\n this.tryAddTrack({\n stream: event.streams[0], \n track: event.track, \n type: 'output'\n });\n }\n\n public saveInputVideoStream(stream: MediaStream, type?: string) {\n const track = stream.getVideoTracks()[0];\n this.tryAddTrack({\n stream, \n track, \n type: 'input', \n source: type || 'main'\n });\n }\n \n public tryAddTrack({stream, track, type, source}: TryAddTrackOptions) {\n if(!source) {\n source = StreamManager.getSource(stream, type);\n }\n\n this.log('tryAddTrack', stream, track, type, source);\n\n const isOutput = type === 'output';\n\n const {player, elements, streamManager} = this;\n \n const tagName = track.kind as StreamItem['kind'];\n const isVideo = tagName === 'video';\n\n const elementEndpoint = isVideo ? source : tagName;\n let element = elements.get(elementEndpoint);\n\n if(isVideo) {\n track.addEventListener('ended', () => {\n this.log('[track] onended');\n elements.delete(elementEndpoint);\n // element.remove();\n }, {once: true});\n }\n \n if(isOutput) {\n streamManager.addTrack(stream, track, type);\n }\n\n const useStream = isVideo ? stream : streamManager.outputStream;\n if(!element) {\n element = document.createElement(tagName);\n element.autoplay = true;\n element.srcObject = useStream;\n element.volume = 1.0;\n\n if((element as any).sinkId !== 'undefined') {\n const {outputDeviceId} = this;\n if(outputDeviceId) {\n (element as any).setSinkId(outputDeviceId);\n }\n }\n \n if(!isVideo) {\n player.appendChild(element);\n }\n // audio.play();\n\n elements.set(elementEndpoint, element);\n } else {\n if(element.paused) {\n element.play().catch(noop);\n }\n\n // ! EVEN IF MEDIASTREAM IS THE SAME NEW TRACK WON'T PLAY WITHOUT REPLACING IT WHEN NEW PARTICIPANT IS ENTERING !\n // if(element.srcObject !== useStream) {\n element.srcObject = useStream;\n // }\n }\n\n return source;\n }\n\n public setMuted(muted?: boolean) {\n this.streamManager.inputStream.getAudioTracks().forEach((track) => {\n if(track?.kind === 'audio') {\n track.enabled = muted === undefined ? !track.enabled : !muted;\n }\n });\n }\n\n protected onInputStream(stream: MediaStream): void {\n if(!this.isClosing) {\n const {streamManager, description} = this;\n streamManager.addStream(stream, 'input');\n \n if(description) {\n streamManager.appendToConference(description);\n }\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport SDPMediaSection from \"./mediaSection\";\nimport SDPSessionSection from \"./sessionSection\";\n\nexport type AttributeKey = 'group' | 'rtcp' | 'ice-ufrag' | \n 'ice-pwd' | 'ice-options' | 'fingerprint' | 'setup' | \n 'mid' | 'extmap' | 'sendonly' | 'msid' | 'rtcp-mux' | \n 'rtpmap' | 'rtcp-fb' | 'fmtp' | 'ssrc' | 'ssrc-group' |\n 'extmap-allow-mixed' | 'msid-semantic';\n\nexport type AttributeMap = {[k in AttributeKey]?: boolean};\n\nexport default class SDP {\n #session: SDPSessionSection;\n #media: SDPMediaSection[];\n\n constructor(session: SDP['session'], mediaSections: SDP['media']) {\n this.#session = session;\n this.#media = mediaSections;\n }\n\n public get session() {\n return this.#session;\n }\n\n public get media() {\n return this.#media;\n }\n\n public get bundle() {\n const bundleLine = this.session.lines.find(line => line.parsed?.key === 'group');\n return bundleLine.value.split(' ').slice(1);\n }\n\n toString() {\n return this.session.lines\n .concat(...this.media.map(section => section.lines))\n .map(line => line.toString()).join('\\r\\n') + '\\r\\n';\n }\n\n /* get buggedMedia() {\n const bundle = this.bundle;\n type A = {\n mid: SDPMediaSection['mid'],\n mediaType: SDPMediaSection['mediaType'],\n direction: SDPMediaSection['direction']\n };\n const out: A[] = [];\n for(let i = 0, length = this.media.length; i < length; ++i) {\n const section = this.media[i];\n const mid = section.mid;\n if(!bundle.includes(mid)) {\n out.push(section);\n }\n }\n\n return out;\n } */\n\n /* get mediaTypes() {\n return this.media.map((section) => {\n return {mid: section.oa.get('mid').oa, type: section.mediaType, direction: section.direction};\n });\n } */\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport default function splitStringByLimitWithRest(str: string, separator: string, limit: number) {\n const splitted = str.split(separator);\n const out: string[] = [];\n\n while(limit > 0 && splitted.length) {\n out.push(splitted.shift());\n --limit;\n }\n\n if(splitted.length) {\n out.push(splitted.join(separator));\n }\n\n return out;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport default class UniqueNumberGenerator {\n #set: Set<number>;\n #min: number;\n #max: number;\n\n constructor(min: number, max: number) {\n this.#set = new Set();\n this.#min = min;\n this.#max = max;\n }\n\n public generate() {\n const min = this.#min;\n const max = this.#max;\n const set = this.#set;\n\n const maxTries = max - min + 1;\n let value = Math.floor(min + maxTries * Math.random()), _try = 0;\n while(set.has(value)) {\n if(value < max) {\n ++value;\n } else {\n value = min;\n }\n\n if(++_try >= maxTries) {\n return null;\n }\n }\n\n set.add(value);\n return value;\n }\n\n public add(value: number) {\n this.#set.add(value);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { AttributeKey } from \".\";\n\nexport default class SDPAttributeSplitted {\n #key: AttributeKey;\n #value: string;\n\n // key = 'ssrc-group', value = 'SIM 1 2 3'\n constructor(key: AttributeKey, value: string) {\n this.#key = key;\n this.#value = value;\n }\n\n public get key() {\n return this.#key;\n }\n\n public get value() {\n return this.#value;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport default class SDPMediaLineParts {\n #type: 'audio' | 'video' | 'application';\n #port: string;\n #protocol: string;\n #ids: string[];\n\n constructor(\n type: SDPMediaLineParts['type'], \n port: SDPMediaLineParts['port'], \n protocol: SDPMediaLineParts['protocol'], \n ids: SDPMediaLineParts['ids']\n ) {\n this.#type = type;\n this.#port = port;\n this.#protocol = protocol;\n this.#ids = ids;\n }\n\n public get type() {\n return this.#type;\n }\n \n public get port() {\n return this.#port;\n }\n\n public get protocol() {\n return this.#protocol;\n }\n\n public get ids() {\n return this.#ids;\n }\n\n toString() {\n return this.type + ' ' + this.port + ' ' + this.protocol + ' ' + this.ids.join(' ');\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport splitStringByLimitWithRest from \"../../../helpers/string/splitStringByLimitWithRest\";\nimport SDPAttributeSplitted from \"./attributeSplitted\";\nimport SDPMediaLineParts from \"./mediaLineParts\";\n\nexport default class SDPLine {\n #key: 'm' | 'a' | 'o' | 'v' | 's' | 't' | 'c';\n #value: string;\n #mediaLineParts: SDPMediaLineParts;\n #parsed?: SDPAttributeSplitted;\n\n // key = 'a', value = 'ssrc-group:SIM 1 2 3'\n constructor(key: SDPLine['key'], value: string | SDPMediaLineParts | SDPAttributeSplitted) {\n this.#key = key;\n\n if(typeof(value) === 'string') {\n this.#value = value;\n\n if(key === 'm') {\n const splitted = value.split(' ');\n this.#mediaLineParts = new SDPMediaLineParts(splitted[0] as any, splitted[1], splitted[2], splitted.slice(3));\n } else {\n if(key === 'a') {\n const result = splitStringByLimitWithRest(value, ':', 1);\n value = result[0];\n this.#parsed = result.length === 1 ? new SDPAttributeSplitted(value as any, null) : new SDPAttributeSplitted(value as any, result[1]);\n }\n }\n } else {\n if(value instanceof SDPMediaLineParts) {\n this.#mediaLineParts = value;\n this.#value = value.toString();\n } else if(value instanceof SDPAttributeSplitted) {\n this.#parsed = value;\n this.#value = value.value ? `${value.key}:${value.value}` : value.key;\n }\n }\n }\n\n public get key() {\n return this.#key;\n }\n\n public get value() {\n return this.#value;\n }\n\n public get parsed() {\n return this.#parsed;\n }\n\n public get mediaLineParts() {\n return this.#mediaLineParts;\n }\n\n toString() {\n return `${this.key}=${this.value}`;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport splitStringByLimitWithRest from \"../../../helpers/string/splitStringByLimitWithRest\";\n\nexport default class SDPAttributeInner {\n #key: string;\n #lines: Array<string>;\n #prefix: string;\n #nestedMap: Map<string, SDPAttributeInner>;\n #missed: boolean;\n #keys: Array<string>;\n\n constructor(key: SDPAttributeInner['key'], lines: SDPAttributeInner['lines'], prefix: string = ':', missed = false) {\n this.#key = key;\n this.#lines = lines;\n this.#prefix = prefix;\n this.#missed = missed;\n this.#nestedMap = missed ? new Map() : null;\n this.#keys = missed ? [] : null;\n }\n\n public get lines() {\n return this.#lines;\n }\n\n public get value() {\n return this.#missed || !this.lines.length ? null : this.lines[0];\n }\n\n public get exists() {\n return !this.#missed;\n }\n\n public get key() {\n return this.#key;\n }\n\n public get keys() {\n SDPAttributeInner.fill(this);\n return this.#keys;\n }\n\n public forEach(callback: Parameters<Map<string, SDPAttributeInner>['forEach']>[0]) {\n SDPAttributeInner.fill(this);\n this.#nestedMap.forEach(callback);\n }\n\n public get(key: string) {\n SDPAttributeInner.fill(this);\n return this.#nestedMap.get(key) || new SDPAttributeInner(key, [], ':', true);\n }\n \n private static fill(attribute: SDPAttributeInner) {\n if(attribute.#nestedMap !== null) {\n return;\n }\n\n const map: Map<string, Array<string>> = new Map();\n attribute.lines.forEach(str => {\n const [key, rest] = splitStringByLimitWithRest(str, attribute.#prefix, 1);\n const values = map.get(key) || [];\n map.set(key, [...values, rest || '']);\n });\n \n const nestedMap = attribute.#nestedMap = SDPAttributeInner.makeAttributes(map);\n attribute.#keys = Array.from(nestedMap.keys());\n }\n\n private static makeAttributes(innerParts: Map<string, Array<string>>) {\n const out: Map<string, SDPAttributeInner> = new Map();\n \n innerParts.forEach((lines, key) => {\n out.set(key, new SDPAttributeInner(key, lines));\n });\n \n return out;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport SDPAttributeInner from \"./attributeInner\";\nimport SDPLine from \"./line\";\n\nexport default class SDPAttributes {\n #lines: SDPLine[];\n #attributes: Map<string, SDPAttributeInner>;\n\n constructor(lines: SDPLine[]) {\n this.#lines = lines;\n this.#attributes = new Map();\n SDPAttributes.fillAttributes(this);\n }\n\n public get(key: string) {\n return this.#attributes.get(key) || new SDPAttributeInner(key, [], ' ', true);\n }\n\n private static fillAttributes(attributes: SDPAttributes) {\n const attributesMap: Map<string, Array<string>> = new Map();\n attributes.#lines.forEach((line) => {\n if(line.key === 'a') {\n const {key, value} = line.parsed;\n\n let linesArray = attributesMap.get(key);\n if(!linesArray) {\n linesArray = [];\n attributesMap.set(key, linesArray);\n }\n \n linesArray.push(value || '');\n }\n });\n\n attributesMap.forEach((linesArray, key) => {\n attributes.#attributes.set(key, new SDPAttributeInner(key, linesArray, ' ', false));\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { AttributeMap } from \".\";\nimport { NoExtraProperties } from \"../../../types\";\nimport SDPAttributes from \"./attributes\";\nimport SDPLine from \"./line\";\n\nexport type SDPMediaDirection = 'sendonly' | 'recvonly' | 'inactive' | 'sendrecv';\nexport default class SDPMediaSection {\n #lines: Array<SDPLine>;\n #mediaLine: SDPLine;\n #attributes: SDPAttributes;\n #direction: SDPMediaDirection;\n\n constructor(lines: Array<SDPLine>) {\n this.#lines = lines;\n this.#mediaLine = lines[0];\n this.#attributes = this.#direction = null;\n }\n\n public get lines() {\n return this.#lines;\n }\n\n public get mediaLine() {\n return this.#mediaLine;\n }\n\n public get mediaLineParts() {\n return this.#mediaLine.mediaLineParts;\n }\n\n public get mediaType() {\n return this.mediaLineParts.type;\n }\n\n public get direction() {\n if(!this.#direction) {\n const attributes = this.attributes;\n\n let direction: SDPMediaDirection;\n if(attributes.get('sendonly').exists) direction = 'sendonly';\n else if(attributes.get('recvonly').exists) direction = 'recvonly';\n else if(attributes.get('inactive').exists) direction = 'inactive';\n else direction = 'sendrecv';\n\n this.#direction = direction;\n }\n\n return this.#direction;\n }\n\n public get isSending() {\n return this.direction === 'sendrecv' || this.direction === 'sendonly';\n }\n\n public get isReceiving() {\n return this.direction === 'sendrecv' || this.direction === 'recvonly';\n }\n\n public get attributes() {\n this.#attributes || (this.#attributes = new SDPAttributes(this.lines));\n return this.#attributes;\n }\n\n public get mid() {\n return this.attributes.get('mid').value;\n }\n\n public lookupAttributeKeys<T extends AttributeMap>(keys: NoExtraProperties<AttributeMap, T>): {[k in keyof T]: T[k] extends true ? string : string[]} {\n const out: any = {};\n\n for(const key in keys) {\n const result = this.attributes.get(key);\n // @ts-ignore\n const resultShouldBeArray = !keys[key];\n if(!result) {\n out[key] = resultShouldBeArray ? [] : undefined;\n } else {\n out[key] = resultShouldBeArray ? result.lines : result.value;\n }\n }\n\n return out;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport SDPLine from \"./line\";\n\nexport default class SDPSessionSection {\n #lines: SDPLine[];\n #sessionId: string;\n\n constructor(lines: SDPLine[]) {\n this.#lines = lines;\n this.#sessionId = lines.filter(line => line.key === 'o').map(line => line.value.split(' ')[1])[0];\n }\n\n public get lines() {\n return this.#lines;\n }\n\n public get sessionId() {\n return this.#sessionId;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport SDP from \".\";\nimport splitStringByLimitWithRest from \"../../../helpers/string/splitStringByLimitWithRest\";\nimport UniqueNumberGenerator from \"../../../helpers/uniqueNumberGenerator\";\nimport SDPLine from \"./line\";\nimport SDPMediaSection from \"./mediaSection\";\nimport SDPSessionSection from \"./sessionSection\";\n\nexport function parseSdp(str: string) {\n function createSection() {\n if(sessionSection) {\n mediaSections.push(new SDPMediaSection(lines));\n } else {\n sessionSection = new SDPSessionSection(lines);\n }\n }\n\n let sessionSection: SDPSessionSection = null, mediaSections: SDPMediaSection[] = [], lines: SDPLine[] = [];\n str.split(/\\r?\\n/).forEach(lineStr => {\n if(!isIncorrectSdpLine(lineStr)) {\n const line = parseSdpLine(lineStr);\n if(line.key === 'm') {\n createSection();\n lines = [];\n }\n\n lines.push(line);\n }\n });\n\n createSection();\n return new SDP(sessionSection, mediaSections);\n}\n\nexport function isIncorrectSdpLine(str: string) {\n return /^[\\s\\xa0]*$/.test(str);\n}\n\nexport function parseSdpLine(str: string) {\n const splitted = splitStringByLimitWithRest(str, '=', 1);\n return new SDPLine(splitted[0] as any, splitted[1]);\n}\n\nexport function addSimulcast(sdp: SDP) {\n let generator: UniqueNumberGenerator;\n sdp.media.forEach((section, idx) => {\n if(section.mediaType === 'video' && section.isSending && !section.attributes.get('ssrc-group').get('SIM').exists) {\n if(!generator) {\n generator = new UniqueNumberGenerator(2, 4294967295);\n }\n\n const originalSsrcs = section.attributes.get('ssrc-group').get('FID').value.split(' ');\n const lines = section.lines;\n originalSsrcs.forEach(ssrc => generator.add(+ssrc)); // fix possible duplicates\n const ssrcs = [originalSsrcs[0], generator.generate(), generator.generate()];\n const ssrcs2 = [originalSsrcs[1], generator.generate(), generator.generate()];\n\n lines.push(parseSdpLine('a=ssrc-group:SIM ' + ssrcs.join(' ')));\n\n const ssrcsStrLines = section.attributes.get('ssrc').get(originalSsrcs[0]).lines;\n\n ssrcs.forEach((ssrc, idx) => {\n const ssrc2 = ssrcs2[idx];\n if(idx > 0) {\n lines.push(parseSdpLine('a=ssrc-group:FID ' + ssrc + ' ' + ssrc2));\n\n ssrcsStrLines.forEach(v => {\n lines.push(parseSdpLine('a=ssrc:' + ssrc + ' ' + v));\n });\n\n ssrcsStrLines.forEach(v => {\n lines.push(parseSdpLine('a=ssrc:' + ssrc2 + ' ' + v));\n });\n }\n });\n\n sdp.media[idx] = new SDPMediaSection(lines);\n }\n });\n\n return !!generator;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport SDP from \"../sdp\";\nimport SDPMediaSection from \"../sdp/mediaSection\";\nimport { toTelegramSource } from \"../utils\";\nimport { parseSourceGroups } from \"./parseSourceGroups\";\n\nexport default function parseMediaSectionInfo(sdp: SDP, channel: SDPMediaSection) {\n const clientInfo = channel.lookupAttributeKeys({\n 'ice-ufrag': true,\n 'ice-pwd': true,\n fingerprint: true,\n setup: true,\n ssrc: true,\n mid: true,\n 'ssrc-group': false\n });\n\n if(!clientInfo.fingerprint) { // support Firefox\n const line = sdp.session.lines.find(line => line.parsed?.key === 'fingerprint');\n clientInfo.fingerprint = line.parsed.value;\n }\n\n const telegramSourceGroups = parseSourceGroups(clientInfo['ssrc-group']);\n const [hash, fingerprint] = clientInfo.fingerprint.split(' ', 2);\n const ssrc = clientInfo.ssrc && toTelegramSource(+clientInfo.ssrc.split(' ', 1)[0]);\n // ssrc = telegramSourceGroups ? telegramSourceGroups[0].sources[0] : ssrc;\n\n return {\n raw: clientInfo,\n ufrag: clientInfo['ice-ufrag'],\n pwd: clientInfo['ice-pwd'],\n fingerprint: {\n fingerprint,\n setup: clientInfo.setup,\n hash\n },\n source: ssrc,\n sourceGroups: telegramSourceGroups,\n mid: clientInfo.mid\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { GroupCallParticipantVideoSourceGroup } from \"../../../layer\";\nimport { toTelegramSource } from \"../utils\";\n\nexport function parseSourceGroups(sdpLines: string[]) {\n const telegramSourceGroups = sdpLines.map(str => {\n const [semantics, ...rest] = str.split(' ');\n\n const sourceGroup: GroupCallParticipantVideoSourceGroup = {\n _: 'groupCallParticipantVideoSourceGroup',\n semantics,\n // sources: rest.map(ssrc => +ssrc)\n sources: rest.map(ssrc => toTelegramSource(+ssrc))\n };\n\n return sourceGroup;\n });\n\n /* const simIndex = telegramSourceGroups.findIndex(g => g.semantics === 'SIM');\n if(simIndex !== -1) {\n const sourceGroup = telegramSourceGroups.splice(simIndex, 1)[0];\n telegramSourceGroups.unshift(sourceGroup);\n } */\n\n return telegramSourceGroups.length ? telegramSourceGroups : undefined;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { forEachReverse } from \"../../../helpers/array\";\nimport { copy } from \"../../../helpers/object\";\nimport { ConferenceEntry } from \"../localConferenceDescription\";\nimport { parseSdp, addSimulcast } from \"../sdp/utils\";\nimport { generateMediaFirstLine, SDPBuilder } from \"../sdpBuilder\";\nimport { UpdateGroupCallConnectionData } from \"../types\";\nimport parseMediaSectionInfo from \"./parseMediaSectionInfo\";\n\nexport default function fixLocalOffer(options: {\n offer: RTCSessionDescriptionInit, \n data: UpdateGroupCallConnectionData,\n skipAddingMulticast?: boolean\n // mids?: string[]\n}) {\n const {offer, data} = options;\n const sdp = parseSdp(offer.sdp);\n let hasMunged = false;\n\n if(!options.skipAddingMulticast) {\n hasMunged = addSimulcast(sdp) || hasMunged;\n }\n\n // const bundleLine = parsedSdp.session.lines.find(line => line.Ha?.key === 'group');\n // const bundleMids = bundleLine.value.split(' ').slice(1);\n\n forEachReverse(sdp.media, (section, idx, arr) => {\n // const mid = section.oa.get('mid').oa;\n\n // это может случиться при выключении и включении видео. почему-то появится секция уже удалённая\n // ! нельзя тут модифицировать локальное описание, будет критовать\n /* if(mids && !mids.includes(mid) && !bundleMids.includes(mid)) {\n console.error('wtf');\n hasMunged = true;\n arr.splice(idx, 1);\n return;\n } */\n\n if(/* section.mediaType !== 'video' || */section.isSending) {\n return;\n }\n\n if(section.mediaType === 'application') {\n return;\n }\n\n const mediaLine = section.mediaLine;\n const mediaLineParts = mediaLine.mediaLineParts;\n const mediaCodecIds = mediaLineParts.ids;\n const localMLine = mediaLine.toString();\n\n const codec = data[section.mediaType];\n const payloadTypes = codec['payload-types'];\n\n /* forEachReverse(payloadTypes, (payloadType, idx, arr) => {\n if(!mediaCodecIds.includes('' + payloadType.id) && section.mediaType === 'video') {\n // if(payloadType.name === 'H265') {\n console.warn('[sdp] filtered unsupported codec', payloadType, mediaCodecIds, section.mediaType);\n arr.splice(idx, 1);\n }\n }); */\n\n const codecIds = payloadTypes.map(payload => '' + payload.id);\n const correctMLine = generateMediaFirstLine(section.mediaType, undefined, codecIds);\n \n if(localMLine !== correctMLine) {\n const sectionInfo = parseMediaSectionInfo(sdp, section);\n\n let newData = {...data};\n newData.transport = copy(newData.transport);\n newData.transport.ufrag = sectionInfo.ufrag;\n newData.transport.pwd = sectionInfo.pwd;\n newData.transport.fingerprints = [sectionInfo.fingerprint];\n newData.transport.candidates = [];\n\n const entry = new ConferenceEntry(sectionInfo.mid, mediaLineParts.type);\n entry.setPort(mediaLineParts.port);\n sectionInfo.source && entry.setSource(sectionInfo.sourceGroups || sectionInfo.source);\n entry.setDirection(section.direction);\n\n const newSdp = new SDPBuilder().addSsrcEntry(entry, newData).finalize();\n\n const newChannel = parseSdp(newSdp).media[0];\n arr[idx] = newChannel;\n\n hasMunged = true;\n }\n });\n\n if(hasMunged) {\n const mungedSdp = sdp.toString();\n offer.sdp = mungedSdp;\n }\n\n return {offer, sdp/* , bundleMids */};\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { forEachReverse } from \"../../helpers/array\";\nimport throttle from \"../../helpers/schedulers/throttle\";\nimport { Updates, PhoneJoinGroupCall, PhoneJoinGroupCallPresentation, Update } from \"../../layer\";\nimport apiUpdatesManager from \"../appManagers/apiUpdatesManager\";\nimport appGroupCallsManager, { GroupCallConnectionType, JoinGroupCallJsonPayload } from \"../appManagers/appGroupCallsManager\";\nimport apiManager from \"../mtproto/apiManager\";\nimport rootScope from \"../rootScope\";\nimport CallConnectionInstanceBase, { CallConnectionInstanceOptions } from \"./callConnectionInstanceBase\";\nimport GroupCallInstance from \"./groupCallInstance\";\nimport filterServerCodecs from \"./helpers/filterServerCodecs\";\nimport fixLocalOffer from \"./helpers/fixLocalOffer\";\nimport processMediaSection from \"./helpers/processMediaSection\";\nimport { ConferenceEntry } from \"./localConferenceDescription\";\nimport SDP from \"./sdp\";\nimport SDPMediaSection from \"./sdp/mediaSection\";\nimport { WebRTCLineType } from \"./sdpBuilder\";\nimport { UpdateGroupCallConnectionData } from \"./types\";\n\nexport default class GroupCallConnectionInstance extends CallConnectionInstanceBase {\n private groupCall: GroupCallInstance;\n public updateConstraints?: boolean;\n private type: GroupCallConnectionType;\n private options: {\n type: Extract<GroupCallConnectionType, 'main'>, \n isMuted?: boolean, \n joinVideo?: boolean, \n rejoin?: boolean\n } | {\n type: Extract<GroupCallConnectionType, 'presentation'>,\n };\n\n private updateConstraintsInterval: number;\n public negotiateThrottled: () => void;\n\n constructor(options: CallConnectionInstanceOptions & {\n groupCall: GroupCallConnectionInstance['groupCall'],\n type: GroupCallConnectionInstance['type'],\n options: GroupCallConnectionInstance['options'],\n }) {\n super(options);\n\n this.negotiateThrottled = throttle(this.negotiate.bind(this), 0, false);\n }\n\n public createPeerConnection() {\n return this.connection || super.createPeerConnection({ \n iceServers: [], \n iceTransportPolicy: 'all', \n bundlePolicy: 'max-bundle', \n rtcpMuxPolicy: 'require', \n iceCandidatePoolSize: 0, \n // sdpSemantics: \"unified-plan\", \n // extmapAllowMixed: true,\n });\n }\n\n public createDataChannel() {\n if(this.dataChannel) {\n return this.dataChannel;\n }\n\n const dataChannel = super.createDataChannel();\n\n dataChannel.addEventListener('open', () => {\n this.maybeUpdateRemoteVideoConstraints();\n });\n\n dataChannel.addEventListener('close', () => {\n if(this.updateConstraintsInterval) {\n clearInterval(this.updateConstraintsInterval);\n this.updateConstraintsInterval = undefined;\n }\n });\n\n return dataChannel;\n }\n\n public createDescription() {\n if(this.description) {\n return this.description;\n }\n\n const description = super.createDescription();\n\n /* const perType = 0;\n const types = ['audio' as const, 'video' as const];\n const count = types.length * perType;\n const init: RTCRtpTransceiverInit = {direction: 'recvonly'};\n types.forEach(type => {\n for(let i = 0; i < perType; ++i) {\n description.createEntry(type).createTransceiver(connection, init);\n }\n }); */\n\n return description;\n }\n\n public appendStreamToConference() {\n super.appendStreamToConference();/* .then(() => {\n currentGroupCall.connections.main.negotiating = false;\n this.startNegotiation({\n type: type,\n isMuted: muted,\n rejoin\n });\n }); */\n }\n\n private async invokeJoinGroupCall(localSdp: SDP, mainChannels: SDPMediaSection[], options: GroupCallConnectionInstance['options']) {\n const {groupCall, description} = this;\n const groupCallId = groupCall.id;\n\n const processedChannels = mainChannels.map(section => {\n const processed = processMediaSection(localSdp, section);\n\n this.sources[processed.entry.type as 'video' | 'audio'] = processed.entry;\n \n return processed;\n });\n\n let promise: Promise<Updates>;\n const audioChannel = processedChannels.find(channel => channel.media.mediaType === 'audio');\n const videoChannel = processedChannels.find(channel => channel.media.mediaType === 'video');\n let {source, params} = audioChannel || {};\n const useChannel = videoChannel || audioChannel;\n\n const channels: {[type in WebRTCLineType]?: typeof audioChannel} = {\n audio: audioChannel,\n video: videoChannel\n };\n\n description.entries.forEach(entry => {\n if(entry.direction === 'sendonly') {\n const channel = channels[entry.type];\n if(!channel) return;\n\n description.setEntrySource(entry, channel.sourceGroups || channel.source);\n description.setEntryPeerId(entry, rootScope.myId);\n }\n });\n\n // overwrite ssrc with audio in video params\n if(params !== useChannel.params) {\n const data: JoinGroupCallJsonPayload = JSON.parse(useChannel.params.data);\n // data.ssrc = source || data.ssrc - 1; // audio channel can be missed in screensharing\n if(source) data.ssrc = source;\n else delete data.ssrc;\n params = {\n _: 'dataJSON',\n data: JSON.stringify(data)\n };\n }\n \n const groupCallInput = appGroupCallsManager.getGroupCallInput(groupCallId);\n if(options.type === 'main') {\n const request: PhoneJoinGroupCall = {\n call: groupCallInput,\n join_as: {_: 'inputPeerSelf'},\n params,\n muted: options.isMuted,\n video_stopped: !options.joinVideo\n };\n\n promise = apiManager.invokeApi('phone.joinGroupCall', request);\n this.log(`[api] joinGroupCall id=${groupCallId}`, request);\n } else {\n const request: PhoneJoinGroupCallPresentation = {\n call: groupCallInput,\n params,\n };\n\n promise = apiManager.invokeApi('phone.joinGroupCallPresentation', request);\n this.log(`[api] joinGroupCallPresentation id=${groupCallId}`, request);\n }\n\n const updates = await promise;\n apiUpdatesManager.processUpdateMessage(updates);\n const update = (updates as Updates.updates).updates.find(update => update._ === 'updateGroupCallConnection') as Update.updateGroupCallConnection;\n\n const data: UpdateGroupCallConnectionData = JSON.parse(update.params.data);\n\n data.audio = data.audio || groupCall.connections.main.description.audio;\n description.setData(data);\n filterServerCodecs(mainChannels, data);\n\n return data;\n }\n\n protected async negotiateInternal() {\n const {connection, description} = this;\n const isNewConnection = connection.iceConnectionState === 'new' && !description.getEntryByMid('0').source;\n const log = this.log.bindPrefix('startNegotiation');\n log('start');\n \n const originalOffer = await connection.createOffer({iceRestart: false});\n\n if(isNewConnection && this.dataChannel) {\n const dataChannelEntry = description.createEntry('application');\n dataChannelEntry.setDirection('sendrecv');\n }\n\n const {sdp: localSdp, offer} = fixLocalOffer({\n offer: originalOffer, \n data: description\n });\n\n log('[sdp] setLocalDescription', offer.sdp);\n await connection.setLocalDescription(offer);\n\n const mainChannels = localSdp.media.filter(media => {\n return media.mediaType !== 'application' && media.isSending;\n });\n\n if(isNewConnection) {\n try {\n await this.invokeJoinGroupCall(localSdp, mainChannels, this.options);\n } catch(e) {\n this.log.error('[tdweb] joinGroupCall error', e);\n }\n }\n \n /* if(!data) {\n log('abort 0');\n this.closeConnectionAndStream(connection, streamManager);\n return;\n } */\n\n /* if(connection.iceConnectionState !== 'new') {\n log(`abort 1 connectionState=${connection.iceConnectionState}`);\n this.closeConnectionAndStream(connection, streamManager);\n return;\n } */\n /* if(this.currentGroupCall !== currentGroupCall || connectionHandler.connection !== connection) {\n log('abort', this.currentGroupCall, currentGroupCall);\n this.closeConnectionAndStream(connection, streamManager);\n return;\n } */\n \n const isAnswer = true;\n // const _bundleMids = bundleMids.slice();\n const entriesToDelete: ConferenceEntry[] = [];\n const bundle = localSdp.bundle;\n forEachReverse(bundle, (mid, idx, arr) => {\n const entry = description.getEntryByMid(mid);\n if(entry.shouldBeSkipped(isAnswer)) {\n arr.splice(idx, 1);\n entriesToDelete.push(entry);\n }\n });\n\n /* forEachReverse(description.entries, (entry, idx, arr) => {\n const mediaSection = _parsedSdp.media.find(section => section.oa.get('mid').oa === entry.mid);\n const deleted = !mediaSection;\n // const deleted = !_bundleMids.includes(entry.mid); // ! can't use it because certain mid can be missed in bundle\n if(deleted) {\n arr.splice(idx, 1);\n }\n }); */\n\n const entries = localSdp.media.map((section) => {\n const mid = section.mid;\n let entry = description.getEntryByMid(mid);\n if(!entry) {\n entry = new ConferenceEntry(mid, section.mediaType);\n entry.setDirection('inactive');\n }\n\n return entry;\n });\n\n const answerDescription: RTCSessionDescriptionInit = {\n type: 'answer',\n sdp: description.generateSdp({\n bundle, \n entries, \n isAnswer\n })\n };\n\n entriesToDelete.forEach(entry => {\n description.deleteEntry(entry);\n });\n\n log(`[sdp] setRemoteDescription signaling=${connection.signalingState} ice=${connection.iceConnectionState} gathering=${connection.iceGatheringState} connection=${connection.connectionState}`, answerDescription.sdp);\n await connection.setRemoteDescription(answerDescription);\n\n log('end');\n }\n\n public negotiate() {\n let promise = this.negotiating;\n if(promise) {\n return promise;\n }\n\n promise = super.negotiate();\n\n if(this.updateConstraints) {\n promise.then(() => {\n this.maybeUpdateRemoteVideoConstraints();\n this.updateConstraints = false;\n });\n }\n\n return promise;\n }\n\n public maybeUpdateRemoteVideoConstraints() {\n if(this.dataChannel.readyState !== 'open') {\n return;\n }\n\n this.log('maybeUpdateRemoteVideoConstraints');\n \n // * https://github.com/TelegramMessenger/tgcalls/blob/6f2746e04c9b040f8c8dfc64d916a1853d09c4ce/tgcalls/group/GroupInstanceCustomImpl.cpp#L2549\n type VideoConstraints = {minHeight?: number, maxHeight: number};\n const obj: {\n colibriClass: 'ReceiverVideoConstraints',\n constraints: {[endpoint: string]: VideoConstraints},\n defaultConstraints: VideoConstraints,\n onStageEndpoints: string[]\n } = {\n colibriClass: 'ReceiverVideoConstraints',\n constraints: {},\n defaultConstraints: {maxHeight: 0},\n onStageEndpoints: []\n };\n\n for(const entry of this.description.entries) {\n if(entry.direction !== 'recvonly' || entry.type !== 'video') {\n continue;\n }\n\n const {endpoint} = entry;\n obj.onStageEndpoints.push(endpoint);\n obj.constraints[endpoint] = {\n minHeight: 180,\n maxHeight: 720\n };\n }\n\n this.sendDataChannelData(obj);\n\n if(!obj.onStageEndpoints.length) {\n if(this.updateConstraintsInterval) {\n clearInterval(this.updateConstraintsInterval);\n this.updateConstraintsInterval = undefined;\n }\n } else if(!this.updateConstraintsInterval) {\n this.updateConstraintsInterval = window.setInterval(this.maybeUpdateRemoteVideoConstraints.bind(this), 5000);\n }\n }\n \n public addInputVideoStream(stream: MediaStream) {\n // const {sources} = this;\n // if(sources?.video) {\n // const source = this.sources.video.source;\n // stream.source = '' + source;\n this.groupCall.saveInputVideoStream(stream, this.type);\n // }\n\n this.streamManager.addStream(stream, 'input');\n this.appendStreamToConference(); // replace sender track\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { safeAssign } from \"../../helpers/object\";\nimport { logger } from \"../logger\";\nimport createDataChannel from \"./helpers/createDataChannel\";\nimport createPeerConnection from \"./helpers/createPeerConnection\";\nimport LocalConferenceDescription from \"./localConferenceDescription\";\nimport StreamManager from \"./streamManager\";\nimport { Ssrc } from \"./types\";\n\nexport type CallConnectionInstanceOptions = {\n streamManager: StreamManager,\n connection?: RTCPeerConnection,\n log?: ReturnType<typeof logger>\n};\n\nexport default abstract class CallConnectionInstanceBase {\n public connection: RTCPeerConnection;\n public streamManager: StreamManager;\n public dataChannel: RTCDataChannel;\n public description: LocalConferenceDescription;\n public sources: {\n audio: Ssrc,\n video?: Ssrc,\n };\n protected negotiating: Promise<void>;\n protected log: ReturnType<typeof logger>;\n\n constructor(options: CallConnectionInstanceOptions) {\n safeAssign(this, options);\n\n if(!this.log) {\n this.log = this.connection?.log || logger('CALL-CONNECTION-BASE');\n }\n\n this.sources = {} as any;\n }\n\n public createPeerConnection(config?: RTCConfiguration) {\n return this.connection || (this.connection = createPeerConnection(config, this.log.bindPrefix('connection')).connection);\n }\n\n public createDataChannel(dict?: RTCDataChannelInit) {\n return this.dataChannel || (this.dataChannel = createDataChannel(this.connection, dict, this.log.bindPrefix('data')));\n }\n\n public createDescription() {\n return this.description || (this.description = new LocalConferenceDescription(this.connection));\n }\n\n public appendStreamToConference() {\n return this.streamManager.appendToConference(this.description);\n }\n\n public closeConnection() {\n const {connection} = this;\n if(!connection) {\n return;\n }\n\n try {\n connection.log('close');\n connection.close();\n } catch(e) {\n this.log.error(e);\n }\n }\n\n public closeConnectionAndStream(stopStream: boolean) {\n this.closeConnection();\n stopStream && this.streamManager.stop();\n }\n\n protected abstract negotiateInternal(): CallConnectionInstanceBase['negotiating'];\n\n public negotiate() {\n let promise = this.negotiating;\n if(promise) {\n return promise;\n }\n\n return this.negotiating = this.negotiateInternal().finally(() => {\n this.negotiating = undefined;\n });\n }\n\n public sendDataChannelData(data: any) {\n if(this.dataChannel.readyState !== 'open') {\n return;\n }\n\n this.dataChannel.send(JSON.stringify(data));\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { Logger, logger } from \"../../logger\";\n\nexport default function createPeerConnection(config: RTCConfiguration, log?: Logger) {\n if(!log) {\n log = logger('RTCPeerConnection');\n }\n\n log('constructor');\n\n // @ts-ignore\n const connection = new RTCPeerConnection(config);\n connection.addEventListener('track', (event) => {\n log('ontrack', event);\n });\n connection.addEventListener('signalingstatechange', () => {\n log('onsignalingstatechange', connection.signalingState);\n });\n connection.addEventListener('connectionstatechange', () => {\n log('onconnectionstatechange', connection.connectionState);\n });\n connection.addEventListener('negotiationneeded', () => { // * will be fired every time input device changes\n log('onnegotiationneeded', connection.signalingState);\n });\n connection.addEventListener('icecandidate', (event) => {\n log('onicecandidate', event);\n });\n connection.addEventListener('iceconnectionstatechange', () => {\n log('oniceconnectionstatechange', connection.iceConnectionState);\n });\n connection.addEventListener('datachannel', () => {\n log('ondatachannel');\n });\n\n connection.log = log;\n\n return {connection};\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { Logger, logger } from \"../../logger\";\n\nexport default function createDataChannel(connection: RTCPeerConnection, dict?: RTCDataChannelInit, log?: Logger) {\n // return;\n\n if(!log) {\n log = logger('RTCDataChannel');\n }\n\n const channel = connection.createDataChannel('data', dict);\n\n channel.addEventListener('message', (e) => {\n log('onmessage', e);\n });\n channel.addEventListener('open', () => {\n log('onopen');\n });\n channel.addEventListener('close', () => {\n log('onclose');\n });\n\n channel.log = log;\n\n return channel;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { DataJSON } from \"../../../layer\";\nimport { JoinGroupCallJsonPayload } from \"../../appManagers/appGroupCallsManager\";\nimport SDP from \"../sdp\";\nimport { Ssrc } from \"../types\";\nimport parseMediaSectionInfo from \"./parseMediaSectionInfo\";\n\nexport default function processMediaSection(sdp: SDP, media: SDP['media'][0]) {\n const sectionInfo = parseMediaSectionInfo(sdp, media);\n\n const mediaType: Exclude<typeof media['mediaType'], 'application'> = media.mediaType as any;\n const entry: Ssrc = {\n source: sectionInfo.source,\n sourceGroups: sectionInfo.sourceGroups,\n type: mediaType\n };\n\n // do not change this value, otherwise onconnectionstatechange won't fire\n sectionInfo.fingerprint.setup = 'active';\n const payload: JoinGroupCallJsonPayload = {\n fingerprints: [sectionInfo.fingerprint],\n pwd: sectionInfo.pwd,\n ssrc: sectionInfo.source,\n 'ssrc-groups': sectionInfo.sourceGroups || [],\n ufrag: sectionInfo.ufrag\n };\n const paramsDataJson = JSON.stringify(payload);\n\n const params: DataJSON = {\n _: 'dataJSON',\n data: paramsDataJson\n };\n\n return {\n params, \n source: sectionInfo.source, \n media, \n sourceGroups: sectionInfo.sourceGroups, \n entry\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { forEachReverse } from \"../../../helpers/array\";\nimport SDPMediaSection from \"../sdp/mediaSection\";\nimport { UpdateGroupCallConnectionData, Codec } from \"../types\";\n\nexport default function filterServerCodecs(mainChannels: SDPMediaSection[], data: UpdateGroupCallConnectionData) {\n // ! Need to filter server's extmap for Firefox\n const performExtmap = (channel: typeof mainChannels[0]) => {\n const out: {[id: string]: string} = {};\n const extmap = channel.attributes.get('extmap');\n extmap.forEach((extmap) => {\n const id = extmap.key.split('/', 1)[0];\n out[id] = extmap.value;\n });\n\n return out;\n };\n\n const codecsToPerform: [Codec, 'audio' | 'video'][] = /* flatten([data, dataPresentation].filter(Boolean).map(data => {\n return */['audio' as const, 'video' as const].filter(type => data[type]).map(type => ([data[type], type]));\n // }));\n\n codecsToPerform.forEach(([codec, type]) => {\n const channel = mainChannels.find(line => line.mediaType === type);\n if(!channel) {\n return;\n }\n\n const extmap = performExtmap(channel);\n forEachReverse(codec[\"rtp-hdrexts\"], (value, index, arr) => {\n if(extmap[value.id] !== value.uri) {\n arr.splice(index, 1);\n console.log(`[sdp] filtered extmap:`, value, index, type);\n }\n });\n });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { IS_SAFARI } from \"../../environment/userAgent\";\nimport { indexOfAndSplice } from \"../../helpers/array\";\nimport { safeAssign } from \"../../helpers/object\";\nimport throttle from \"../../helpers/schedulers/throttle\";\nimport { GroupCall, GroupCallParticipant, Updates } from \"../../layer\";\nimport apiUpdatesManager from \"../appManagers/apiUpdatesManager\";\nimport appGroupCallsManager, { GroupCallConnectionType, GroupCallId, GroupCallOutputSource } from \"../appManagers/appGroupCallsManager\";\nimport appPeersManager from \"../appManagers/appPeersManager\";\nimport { logger } from \"../logger\";\nimport apiManager from \"../mtproto/apiManager\";\nimport { NULL_PEER_ID } from \"../mtproto/mtproto_config\";\nimport rootScope from \"../rootScope\";\nimport CallInstanceBase, { TryAddTrackOptions } from \"./callInstanceBase\";\nimport GroupCallConnectionInstance from \"./groupCallConnectionInstance\";\nimport GROUP_CALL_STATE from \"./groupCallState\";\nimport getScreenConstraints from \"./helpers/getScreenConstraints\";\nimport getScreenStream from \"./helpers/getScreenStream\";\nimport getStream from \"./helpers/getStream\";\nimport getVideoConstraints from \"./helpers/getVideoConstraints\";\nimport stopTrack from \"./helpers/stopTrack\";\nimport localConferenceDescription from \"./localConferenceDescription\";\nimport { WebRTCLineType } from \"./sdpBuilder\";\nimport StreamManager from \"./streamManager\";\nimport { Ssrc } from \"./types\";\n\nexport default class GroupCallInstance extends CallInstanceBase<{\n state: (state: GROUP_CALL_STATE) => void,\n pinned: (source?: GroupCallOutputSource) => void,\n}> {\n public id: GroupCallId;\n public chatId: ChatId;\n public handleUpdateGroupCallParticipants: boolean;\n public updatingSdp: boolean;\n public isSpeakingMap: Map<any, any>;\n public connections: {[k in GroupCallConnectionType]?: GroupCallConnectionInstance};\n public groupCall: GroupCall;\n public participant: GroupCallParticipant;\n \n // will be set with negotiation\n public joined: boolean;\n \n private pinnedSources: Array<GroupCallOutputSource>;\n private participantsSsrcs: Map<PeerId, Ssrc[]>;\n private hadAutoPinnedSources: Set<GroupCallOutputSource>;\n private dispatchPinnedThrottled: () => void;\n private startVideoSharingPromise: Promise<void>;\n private startScreenSharingPromise: Promise<void>;\n\n constructor(options: {\n id: GroupCallInstance['id'],\n chatId: GroupCallInstance['chatId'],\n isSpeakingMap?: GroupCallInstance['isSpeakingMap'],\n connections?: GroupCallInstance['connections']\n }) {\n super();\n\n safeAssign(this, options);\n\n if(!this.log) {\n this.log = logger('GROUP-CALL');\n }\n\n if(!this.connections) {\n this.connections = {};\n }\n\n if(!this.isSpeakingMap) {\n this.isSpeakingMap = new Map();\n }\n\n this.pinnedSources = [];\n this.participantsSsrcs = new Map();\n this.hadAutoPinnedSources = new Set();\n this.dispatchPinnedThrottled = throttle(() => {\n this.dispatchEvent('pinned', this.pinnedSource);\n }, 0, false);\n\n this.addEventListener('state', (state) => {\n if(state === GROUP_CALL_STATE.CLOSED) {\n this.cleanup();\n }\n });\n }\n\n get connectionState() {\n return this.connections.main.connection.iceConnectionState;\n }\n\n get state() {\n const {connectionState} = this;\n if(connectionState === 'closed') {\n return GROUP_CALL_STATE.CLOSED;\n } else if(connectionState !== 'connected' && (!IS_SAFARI || connectionState !== 'completed')) {\n return GROUP_CALL_STATE.CONNECTING;\n } else {\n const {participant} = this;\n if(!participant.pFlags.can_self_unmute) {\n return GROUP_CALL_STATE.MUTED_BY_ADMIN;\n } else if(participant.pFlags.muted) {\n return GROUP_CALL_STATE.MUTED;\n } else {\n return GROUP_CALL_STATE.UNMUTED;\n }\n }\n }\n\n get participants() {\n return appGroupCallsManager.getCachedParticipants(this.id);\n }\n\n get isSharingScreen() {\n return !!this.connections.presentation;\n }\n\n get pinnedSource() {\n return this.pinnedSources[this.pinnedSources.length - 1];\n }\n\n public get isMuted() {\n return this.state !== GROUP_CALL_STATE.UNMUTED;\n }\n\n public get isClosing() {\n const {state} = this;\n return state === GROUP_CALL_STATE.CLOSED;\n }\n\n public get streamManager(): StreamManager {\n return this.connections.main.streamManager;\n }\n\n public get description(): localConferenceDescription {\n return this.connections.main.description;\n }\n\n public pinSource(source: GroupCallOutputSource) {\n indexOfAndSplice(this.pinnedSources, source);\n this.pinnedSources.push(source);\n this.dispatchPinnedThrottled();\n }\n\n public unpinSource(source: GroupCallOutputSource) {\n this.hadAutoPinnedSources.delete(source);\n indexOfAndSplice(this.pinnedSources, source);\n this.dispatchPinnedThrottled();\n }\n\n public unpinAll() {\n this.pinnedSources.length = 0;\n this.dispatchPinnedThrottled();\n }\n\n public getParticipantByPeerId(peerId: PeerId) {\n return NULL_PEER_ID === peerId ? this.participant : this.participants.get(peerId);\n }\n\n public toggleMuted() {\n return this.requestAudioSource(true).then(() => appGroupCallsManager.toggleMuted());\n }\n\n public getElement(endpoint: GroupCallOutputSource) {\n return super.getElement(endpoint);\n }\n\n public getVideoElementFromParticipantByType(participant: GroupCallParticipant, type: 'video' | 'presentation') {\n let source: GroupCallOutputSource;\n if(participant.pFlags.self) {\n const connectionType: GroupCallConnectionType = type === 'video' ? 'main' : 'presentation';\n source = connectionType;\n } else {\n const codec = participant[type];\n source = codec.source_groups[0].sources[0];\n }\n\n const element = this.getElement(source) as HTMLVideoElement;\n if(!element) return;\n\n const clone = element.cloneNode() as typeof element;\n clone.srcObject = element.srcObject;\n clone.setAttribute('playsinline', 'true');\n clone.muted = true;\n return {video: clone, source};\n }\n\n public createConnectionInstance(options: {\n streamManager: StreamManager,\n type: GroupCallConnectionType,\n options: GroupCallConnectionInstance['options'],\n }) {\n return this.connections[options.type] = new GroupCallConnectionInstance({\n groupCall: this,\n log: this.log.bindPrefix(options.type),\n ...options\n });\n }\n\n public changeRaiseHand(raise: boolean) {\n return appGroupCallsManager.editParticipant(this.id, this.participant, {raiseHand: raise});\n }\n\n public async startScreenSharingInternal() {\n try {\n const type: GroupCallConnectionType = 'presentation';\n\n const stream = await getScreenStream(getScreenConstraints());\n const streamManager = new StreamManager();\n \n const connectionInstance = this.createConnectionInstance({\n streamManager,\n type,\n options: {\n type\n }\n });\n \n const connection = connectionInstance.createPeerConnection();\n connection.addEventListener('negotiationneeded', () => {\n connectionInstance.negotiate();\n });\n\n stream.getVideoTracks()[0].addEventListener('ended', () => {\n if(this.connections.presentation) { // maybe user has stopped screensharing through browser's ui\n this.stopScreenSharing();\n }\n }, {once: true});\n \n connectionInstance.createDescription();\n connectionInstance.addInputVideoStream(stream);\n } catch(err) {\n this.log.error('start screen sharing error', err);\n }\n }\n\n public startScreenSharing() {\n return this.startScreenSharingPromise || (this.startScreenSharingPromise = this.startScreenSharingInternal().finally(() => {\n this.startScreenSharingPromise = undefined;\n }));\n }\n\n public stopScreenSharing() {\n const connectionInstance = this.connections.presentation;\n if(!connectionInstance) {\n return Promise.resolve();\n }\n\n delete this.connections.presentation;\n this.unpinSource('presentation');\n connectionInstance.closeConnectionAndStream(true);\n\n delete this.participant.presentation;\n appGroupCallsManager.saveApiParticipant(this.id, this.participant);\n\n return apiManager.invokeApi('phone.leaveGroupCallPresentation', {\n call: appGroupCallsManager.getGroupCallInput(this.id)\n }).then(updates => {\n apiUpdatesManager.processUpdateMessage(updates);\n });\n }\n\n public toggleScreenSharing() {\n if(this.isSharingScreen) {\n return this.stopScreenSharing();\n } else {\n return this.startScreenSharing();\n }\n }\n\n public async startVideoSharingInternal() {\n const constraints: MediaStreamConstraints = {\n video: getVideoConstraints()\n };\n\n try {\n const stream = await getStream(constraints, false);\n const connectionInstance = this.connections.main;\n connectionInstance.addInputVideoStream(stream);\n\n await appGroupCallsManager.editParticipant(this.id, this.participant, {\n videoPaused: false,\n videoStopped: false\n });\n } catch(err) {\n this.log.error('startVideoSharing error', err, constraints);\n }\n }\n\n public startVideoSharing() {\n return this.startVideoSharingPromise || (this.startVideoSharingPromise = this.startVideoSharingInternal().finally(() => {\n this.startVideoSharingPromise = undefined;\n }));\n }\n\n public async stopVideoSharing() {\n const connectionInstance = this.connections.main;\n const track = connectionInstance.streamManager.inputStream.getVideoTracks()[0];\n if(!track) {\n return;\n }\n\n stopTrack(track);\n connectionInstance.streamManager.appendToConference(connectionInstance.description); // clear sender track\n\n await appGroupCallsManager.editParticipant(this.id, this.participant, {\n videoStopped: true\n });\n }\n\n public toggleVideoSharing() {\n if(this.isSharingVideo) {\n return this.stopVideoSharing();\n } else {\n return this.startVideoSharing();\n }\n }\n\n public async hangUp(discard = false, rejoin = false, isDiscarded = false) {\n for(const type in this.connections) {\n const connection = this.connections[type as GroupCallConnectionType];\n connection.closeConnectionAndStream(!rejoin);\n }\n\n this.dispatchEvent('state', this.state);\n\n if(isDiscarded) {\n return;\n }\n \n if(!rejoin) {\n let promise: Promise<Updates>;\n const groupCallInput = appGroupCallsManager.getGroupCallInput(this.id);\n\n if(discard) {\n this.log(`[api] discardGroupCall id=${this.id}`);\n promise = apiManager.invokeApi('phone.discardGroupCall', {\n call: groupCallInput\n });\n } else if(this.joined) {\n this.log(`[api] leaveGroupCall id=${this.id}`);\n const connectionInstance = this.connections.main;\n promise = apiManager.invokeApi('phone.leaveGroupCall', {\n call: groupCallInput,\n source: connectionInstance.sources.audio.source\n });\n } else {\n this.log(`[api] id=${this.id} payload=null`);\n promise = apiManager.invokeApi('phone.joinGroupCall', {\n call: groupCallInput,\n join_as: {_: 'inputPeerSelf'},\n muted: true,\n video_stopped: true,\n params: {\n _: 'dataJSON',\n data: ''\n }\n });\n }\n\n const updates = await promise;\n apiUpdatesManager.processUpdateMessage(updates);\n }\n }\n\n public tryAddTrack(options: Omit<TryAddTrackOptions, 'streamManager'>) {\n const {description} = this;\n const source = super.tryAddTrack(options);\n \n if(options.type === 'output') {\n const entry = description.getEntryBySource(+source);\n const participant = this.participants.get(entry.peerId);\n if(participant) {\n rootScope.dispatchEvent('group_call_participant', {groupCallId: this.id, participant});\n }\n }\n\n return source;\n }\n\n public onParticipantUpdate(participant: GroupCallParticipant, doNotDispatchParticipantUpdate?: PeerId) {\n const connectionInstance = this.connections.main;\n const {connection, description} = connectionInstance;\n\n const peerId = appPeersManager.getPeerId(participant.peer);\n const hasLeft = !!participant.pFlags.left;\n const oldSsrcs = this.participantsSsrcs.get(peerId) || [];\n\n if(participant.presentation && !hasLeft) {\n const {source} = appGroupCallsManager.makeSsrcFromParticipant(participant, 'video', participant.presentation.source_groups, participant.presentation.endpoint);\n if(!this.hadAutoPinnedSources.has(source)) {\n this.hadAutoPinnedSources.add(source);\n this.pinSource(participant.pFlags.self ? 'presentation' : source);\n }\n }\n\n if(participant.pFlags.self) {\n this.participant = participant;\n\n if(connectionInstance.sources.audio.source !== participant.source) {\n this.hangUp();\n }\n\n let mute = false;\n if(!participant.pFlags.can_self_unmute) {\n this.stopScreenSharing();\n this.stopVideoSharing();\n mute = true;\n } else if(participant.pFlags.muted) {\n mute = true;\n }\n\n if(mute) {\n this.setMuted(true);\n }\n\n if(doNotDispatchParticipantUpdate !== peerId) {\n this.dispatchEvent('state', this.state);\n }\n\n return;\n }\n\n const ssrcs = hasLeft ? [] : appGroupCallsManager.makeSsrcsFromParticipant(participant);\n\n if(!hasLeft) {\n this.participantsSsrcs.set(peerId, ssrcs);\n } else {\n this.participantsSsrcs.delete(peerId);\n }\n\n // const TEST_OLD = false;\n\n const modifiedTypes: Set<WebRTCLineType> = new Set();\n oldSsrcs.forEach(oldSsrc => {\n const oldSource = oldSsrc.source;\n const newSsrc = ssrcs.find(ssrc => ssrc.source === oldSource);\n if(!newSsrc) {\n this.unpinSource(oldSource);\n\n const oldEntry = description.getEntryBySource(oldSource);\n if(oldEntry && oldEntry.direction !== 'inactive') {\n oldEntry.setDirection('inactive');\n modifiedTypes.add(oldEntry.type);\n }\n }\n });\n\n ssrcs.forEach(ssrc => {\n let entry = description.getEntryBySource(ssrc.source);\n if(entry) {\n if(entry.direction === 'inactive') {\n entry.setDirection(entry.originalDirection);\n modifiedTypes.add(entry.type);\n }\n\n return;\n }\n\n entry = description.createEntry(ssrc.type);\n description.setEntrySource(entry, ssrc.sourceGroups || ssrc.source);\n description.setEntryPeerId(entry, peerId);\n\n // if(TEST_OLD) {\n // description.bundleMids.push(entry.mid);\n // entry.setDirection('recvonly');\n // } else {\n ssrc.type === 'video' && entry.setEndpoint(ssrc.endpoint);\n entry.createTransceiver(connection, {direction: 'recvonly'});\n // }\n\n modifiedTypes.add(entry.type);\n });\n\n /* if(TEST_OLD) {\n this.setRemoteOffer({\n connection,\n description,\n ssrcs\n });\n } else */if(modifiedTypes.size) {\n if(modifiedTypes.has('video')) {\n connectionInstance.updateConstraints = true;\n }\n\n connectionInstance.negotiateThrottled();\n }\n }\n}\n","export default function getScreenConstraints(): DisplayMediaStreamConstraints {\n return {\n video: {\n // @ts-ignore\n // cursor: 'always',\n width: {max: 1920},\n height: {max: 1080},\n frameRate: {max: 30}\n },\n audio: true\n };\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport I18n, { i18n, join, LangPackKey } from \"../lib/langPack\";\r\nimport formatDuration, { DurationType } from \"./formatDuration\";\r\n\r\nconst CALL_DURATION_LANG_KEYS: {[type in DurationType]: LangPackKey} = {\r\n s: 'Seconds',\r\n m: 'Minutes',\r\n h: 'Hours',\r\n d: 'Days',\r\n w: 'Weeks'\r\n};\r\nexport default function formatCallDuration(duration: number, plain?: boolean) {\r\n const a = formatDuration(duration, 2);\r\n if(plain) {\r\n const strings = a.map(d => I18n.format(CALL_DURATION_LANG_KEYS[d.type], true, [d.duration]));\r\n return join(strings, false, plain);\r\n }\r\n\r\n const elements = a.map(d => i18n(CALL_DURATION_LANG_KEYS[d.type], [d.duration]));\r\n\r\n const fragment = document.createElement('span');\r\n fragment.append(...join(elements, false));\r\n\r\n return fragment;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport type DurationType = 's' | 'm' | 'h' | 'd' | 'w';\r\nexport default function formatDuration(duration: number, showLast = 2) {\r\n if(!duration) {\r\n duration = 1;\r\n }\r\n\r\n let d: {duration: number, type: DurationType}[] = [];\r\n const p = [\r\n {m: 1, t: 's'},\r\n {m: 60, t: 'm'}, \r\n {m: 60, t: 'h'}, \r\n {m: 24, t: 'd'}, \r\n {m: 7, t: 'w'}\r\n ] as Array<{m?: number, t: DurationType}>\r\n const s = 1;\r\n let t = s;\r\n p.forEach((o, idx) => {\r\n t *= o.m;\r\n\r\n if(duration < t) {\r\n return;\r\n }\r\n\r\n const modulus = p[idx === (p.length - 1) ? idx : idx + 1].m;\r\n d.push({\r\n duration: (duration / t % modulus | 0),\r\n type: o.t\r\n });\r\n });\r\n\r\n const out = d.slice(-showLast).reverse();\r\n for(let i = out.length - 1; i >= 0; --i) {\r\n if(out[i].duration === 0) {\r\n out.splice(i, 1);\r\n }\r\n }\r\n \r\n return out;\r\n}\r\n","import { IS_APPLE_MOBILE, IS_SAFARI } from \"./userAgent\";\n\n// mov is not supported in Chrome on macOS\nconst IS_MOV_SUPPORTED = !!document.createElement('video').canPlayType('video/quicktime') || IS_SAFARI || IS_APPLE_MOBILE;\n\nexport default IS_MOV_SUPPORTED;\n","import IS_MOV_SUPPORTED from \"./movSupport\";\n\nconst VIDEO_MIME_TYPES_SUPPORTED = new Set([\n 'image/gif', // have to display it as video\n 'video/mp4',\n 'video/webm'\n]);\n\nif(IS_MOV_SUPPORTED) {\n VIDEO_MIME_TYPES_SUPPORTED.add('video/quicktime');\n}\n\nexport default VIDEO_MIME_TYPES_SUPPORTED;\n","import constraintSupported, { MyMediaTrackSupportedConstraints } from \"../../../environment/constraintSupport\";\n\nexport default function getAudioConstraints(): MediaTrackConstraints {\n const constraints: MediaTrackConstraints = {\n channelCount: 2\n };\n\n const desirable: (keyof MyMediaTrackSupportedConstraints)[] = [\n 'noiseSuppression',\n 'echoCancellation',\n 'autoGainControl'\n ];\n\n desirable.forEach(constraint => {\n if(constraintSupported(constraint)) {\n // @ts-ignore\n constraints[constraint] = true;\n }\n });\n\n return constraints;\n}\n","export type MyMediaTrackSupportedConstraints = MediaTrackSupportedConstraints & {\n noiseSuppression?: boolean, \n autoGainControl?: boolean\n};\n\nexport default function constraintSupported(constraint: keyof MyMediaTrackSupportedConstraints) {\n return (!!navigator?.mediaDevices?.getSupportedConstraints() as any as MyMediaTrackSupportedConstraints)[constraint];\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/evgeny-nadymov/telegram-react\n * Copyright (C) 2018 Evgeny Nadymov\n * https://github.com/evgeny-nadymov/telegram-react/blob/master/LICENSE\n */\n\nimport { IS_FIREFOX } from '../../environment/userAgent';\nimport LocalConferenceDescription, { ConferenceEntry } from './localConferenceDescription';\nimport StringFromLineBuilder from './stringFromLineBuilder';\nimport { GroupCallConnectionTransport, PayloadType, UpdateGroupCallConnectionData } from './types';\nimport { fromTelegramSource } from './utils';\n\nexport type WebRTCLineType = 'video' | 'audio' | 'application';\n\nexport const WEBRTC_MEDIA_PORT = '9';\n\nexport function performCandidate(c: GroupCallConnectionTransport['candidates'][0]) {\n const arr: string[] = [];\n arr.push('a=candidate:');\n arr.push(`${c.foundation} ${c.component} ${c.protocol.toUpperCase()} ${c.priority} ${c.ip} ${c.port} typ ${c.type}`);\n if(c['rel-addr'] !== undefined) {\n arr.push(` raddr ${c['rel-addr']} rport ${c['rel-port']}`);\n }\n arr.push(` generation ${c.generation}`);\n return arr.join('');\n}\n\nexport function getConnectionTypeForMediaType(mediaType: WebRTCLineType) {\n return mediaType === 'application' ? 'DTLS/SCTP' : 'RTP/SAVPF';\n}\n\nexport function generateMediaFirstLine(mediaType: WebRTCLineType, port = WEBRTC_MEDIA_PORT, payloadIds: (string | number)[]) {\n const connectionType = getConnectionTypeForMediaType(mediaType);\n return `m=${mediaType} ${port} ${connectionType} ${payloadIds.join(' ')}`;\n}\n\ntype ConferenceData = UpdateGroupCallConnectionData;\n\n// https://tools.ietf.org/id/draft-ietf-rtcweb-sdp-08.html\n// https://datatracker.ietf.org/doc/html/draft-roach-mmusic-unified-plan-00\nexport class SDPBuilder extends StringFromLineBuilder {\n public addCandidate(c: GroupCallConnectionTransport['candidates'][0]) {\n return this.add(performCandidate(c));\n }\n\n /* public addDataChannel(mid: string, transport: GroupCallConnectionTransport, isAnswer?: boolean) {\n this.add(\n 'm=application 9 UDP/DTLS/SCTP webrtc-datachannel',\n 'c=IN IP4 0.0.0.0',\n 'a=ice-options:trickle',\n `a=mid:${mid}`\n );\n\n // if(!isAnswer) {\n this.add('a=sendrecv');\n // }\n\n this.addTransport(transport, isAnswer);\n\n return this.add(\n 'a=sctp-port:5000',\n 'a=max-message-size:262144'\n );\n } */\n \n public addHeader(sId: string, bundleMids: string[]) {\n const bundle = bundleMids.join(' ');\n return this.add(\n 'v=0', // version\n `o=- ${sId} 2 IN IP4 0.0.0.0`, // sessionId, 2=sessionVersion\n 's=-', // name of the session\n 't=0 0', // time when session is valid\n 'a=extmap-allow-mixed',\n `a=group:BUNDLE ${bundle}`,\n 'a=ice-options:trickle',\n 'a=ice-lite', // ice-lite: is a minimal version of the ICE specification, intended for servers running on a public IP address.\n 'a=msid-semantic:WMS *'\n );\n }\n \n public addTransport(transport: GroupCallConnectionTransport, skipCandidates?: boolean) {\n this.add(\n `a=ice-ufrag:${transport.ufrag}`,\n `a=ice-pwd:${transport.pwd}`,\n 'a=ice-options:trickle' // ! test\n );\n\n for(const fingerprint of transport.fingerprints) {\n this.add(\n `a=fingerprint:${fingerprint.hash} ${fingerprint.fingerprint}`,\n `a=setup:${fingerprint.setup}`\n );\n }\n\n if(!skipCandidates && transport.candidates) {\n for(const candidate of transport.candidates) {\n this.addCandidate(candidate);\n }\n }\n\n return this;\n }\n\n public addSsrc(entry: ConferenceEntry) {\n let streamName = 'stream';\n let {type, sourceGroups} = entry;\n\n // let source = ssrc.source ?? ssrc.sourceGroups[0].sources[0];\n // source = fromTelegramSource(source);\n const source = fromTelegramSource(entry.source);\n\n streamName += source;\n type += source as any;\n\n // streamName += mid;\n // type += mid as any;\n\n // streamName = type = entry.transceiver.receiver.track.id as any;\n\n const addMsid = () => {\n this.add(`a=msid:${streamName} ${type}`);\n };\n\n const addSource = (ssrc: number) => {\n this.add(\n `a=ssrc:${ssrc} cname:${streamName}`,\n `a=ssrc:${ssrc} msid:${streamName} ${type}`,\n `a=ssrc:${ssrc} mslabel:${streamName}`,\n `a=ssrc:${ssrc} label:${type}`\n );\n };\n\n addMsid();\n if(sourceGroups?.length) {\n sourceGroups.forEach(ssrcGroup => {\n if(ssrcGroup.sources.length) {\n const sources = ssrcGroup.sources.map(fromTelegramSource);\n this.add(`a=ssrc-group:${ssrcGroup.semantics} ${sources.join(' ')}`);\n sources.forEach(addSource);\n }\n });\n } else {\n addSource(source);\n }\n \n return this;\n }\n\n public addSsrcEntry(entry: ConferenceEntry, data: ConferenceData, isAnswer?: boolean) {\n const add = (...x: string[]) => this.add(...x);\n \n const {type, mid, direction, port} = entry;\n const transport = data.transport;\n\n /* if(type === 'application') {\n return this.addDataChannel(mid, transport, isAnswer);\n } */\n\n const isApplication = type === 'application';\n const codec = isApplication ? undefined : data[type];\n\n const isInactive = direction === 'inactive';\n if(entry.shouldBeSkipped(isAnswer)) {\n return add(\n `m=${type} 0 ${getConnectionTypeForMediaType(type)} 0`,\n `c=IN IP4 0.0.0.0`,\n `a=inactive`,\n `a=mid:${mid}`\n );\n }\n \n const payloadTypes = !isApplication ? codec['payload-types'] : [{id: 5000} as PayloadType];\n const ids = payloadTypes.map(type => type.id);\n add(\n generateMediaFirstLine(type, port, ids),\n 'c=IN IP4 0.0.0.0',\n `a=rtcp:${port} IN IP4 0.0.0.0`,\n );\n\n if(transport['rtcp-mux']) {\n add('a=rtcp-mux');\n }\n\n add(`a=mid:${mid}`);\n /* if(type === 'video') {\n add('b=AS:2500');\n } */\n\n let setDirection = direction;\n if(direction !== 'sendrecv' && isAnswer && !(isInactive || isApplication)) {\n setDirection = direction === 'sendonly' ? 'recvonly' : 'sendonly';\n }\n\n // a=bundle-only\n add(`a=${setDirection}`);\n \n // this.addTransport(transport, isAnswer);\n this.addTransport(transport);\n\n if(!isApplication) {\n const hdrexts = codec['rtp-hdrexts'];\n if(hdrexts?.length) {\n hdrexts.forEach(hdrext => {\n add(`a=extmap:${hdrext.id} ${hdrext.uri}`);\n });\n }\n \n payloadTypes.forEach(type => {\n add(`a=rtpmap:${type.id} ${type.name}/${type.clockrate}${type.channels && type.channels > 1 ? `/${type.channels}` : ''}`);\n \n const parameters = type.parameters;\n if(Array.isArray(parameters)) {\n if(parameters.length) {\n console.error('parameters is array???', parameters);\n }\n } else if(parameters && Object.keys(parameters).length) {\n const p: string[] = [];\n for(const i in parameters) {\n p.push(`${i}=${parameters[i]}`);\n }\n add(`a=fmtp:${type.id} ${p.join(';')}`);\n }\n \n const fbs = type['rtcp-fbs'];\n if(fbs?.length) {\n fbs.forEach(fb => {\n add(`a=rtcp-fb:${type.id} ${fb.type}${fb.subtype ? ' ' + fb.subtype : ''}`);\n });\n }\n });\n } else {\n add(`a=sctpmap:${payloadTypes[0].id} webrtc-datachannel 256`);\n }\n\n if(entry.source && (setDirection === 'sendonly' || setDirection === 'sendrecv')) {\n this.addSsrc(entry);\n }\n\n return this;\n }\n \n public addConference(options: {\n conference: LocalConferenceDescription, \n bundle: string[],\n entries: ConferenceEntry[],\n isAnswer?: boolean, \n }) {\n const {conference, entries, bundle, isAnswer} = options;\n this.addHeader(conference.sessionId, bundle);\n\n if(IS_FIREFOX) {\n this.addTransport(conference.transport); // support Firefox\n }\n\n for(const entry of entries) {\n // this.addSsrcEntry(entry, conference, isAnswer);\n this.addSsrcEntry((isAnswer ? entry.recvEntry || entry.sendEntry : entry.sendEntry || entry.recvEntry) || entry, conference, isAnswer);\n }\n\n return this;\n }\n \n public static fromConference(options: Parameters<SDPBuilder['addConference']>[0]) {\n return new SDPBuilder().addConference(options).finalize();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/evgeny-nadymov/telegram-react\n * Copyright (C) 2018 Evgeny Nadymov\n * https://github.com/evgeny-nadymov/telegram-react/blob/master/LICENSE\n */\n\nexport default class StringFromLineBuilder {\n private lines: string[] = [];\n private newLine: string[] = [];\n\n constructor(private joiner = '\\r\\n') {\n\n }\n\n public add(...strs: string[]) {\n this.lines.push(...strs);\n return this;\n }\n\n public push(word: string) {\n this.newLine.push(word);\n return this;\n }\n \n public addJoined(separator = '') {\n this.add(this.newLine.join(separator));\n this.newLine = [];\n return this;\n }\n\n public join() {\n return this.lines.join(this.joiner);\n }\n\n public finalize() {\n return this.join() + this.joiner;\n }\n}\n"],"sourceRoot":""}